滴滴Java开发工程师面试经验
面试题目
一面
- 讲解一下HashSet的原理;如何保证不重复;为什么说它不安全;
- 说一下你对锁的理解;如何保证并发可见性;
- 说一下你对MySQL的理解;
- 项目拷打:针对极端情况的应对方案;
- 手撕:鸡兔同笼问题。
二面
- 项目拷打:深挖项目架构与难点;
- 频繁发生Full GC如何解决?
- 有没有遇到线上问题?怎么解决的?
- 手撕:SQL编写;二叉树两个节点的公共祖先。
参考解析
- HashSet原理:底层基于HashMap实现,使用Key存储对象,Value存一个常量对象。通过hashCode()和equals()保证唯一性。因其非线程安全,并发环境下可能导致数据覆盖或丢失,应使用ConcurrentHashMap或Collections.synchronizedSet。
- 并发可见性:通过volatile关键字保证变量修改对所有线程立即可见;此外,synchronized和ReentrantLock在释放锁之前会将工作内存数据刷新回主内存,也能保证可见性。
- Full GC排查:检查是否存在内存泄漏(如长生命周期对象)、频繁创建大对象、或元空间溢出。工具可使用jstat分析GC频率,jmap/jhat导出堆转储文件,通过MAT分析对象引用链。
- 二叉树公共祖先:利用递归思想,若当前节点为null或等于其中一个目标节点则直接返回。若左右子树递归结果均不为null,说明当前节点即为最近公共祖先;否则返回非空的那一侧结果。