一、集合源码:HashMap 全家桶(90%的人栽在这)
1. HashMap 底层结构到底怎么变?
2. HashMap 的 put 流程(源码背不背,区别很大)
对 key 求 hash((h = key.hashCode()) ^ (h >>> 16),高低 16 位异或,让高位也参与运算) 判断数组是否为空,为空先初始化(懒加载) 用 (n - 1) & hash 定位桶下标(等价取模,但位运算更快,前提 n 是 2 的幂) 桶为空直接放;不为空则遍历链表/树,key 相等覆盖,否则尾插 插入后判断是否超阈值,超了就扩容
3. HashMap 扩容机制 + 1.7 的"死循环"元凶
4. HashMap / HashTable / ConcurrentHashMap 线程安全对比
synchronized | |||
二、Java 基础进阶:问不倒系列
5. 深拷贝 vs 浅拷贝
6. 异常体系,一次讲透
Throwable├── Error(不可恢复,如 OOM、StackOverflowError,不该 catch)└── Exception├── RuntimeException(unchecked,可不用显式处理,如 NPE、越界、ClassCastException)└── Checked Exception(checked,编译期强制处理,如 IOException、SQLException)
7. 反射是什么?慢在哪?
8. 动态代理:JDK vs CGLIB
9. Java 8 新特性,面试必问三件
三、JVM 进阶:源码级深挖
10. 类加载机制 + 双亲委派模型
11. JVM 内存区域划分
12. 对象创建过程
13. OOM 怎么排查?
jmap -dump:format=b,file=heap.hprof 导出堆快照 MAT / VisualVM 分析大对象、支配树、GC Roots 引用链 jstat -gcutil 看 GC 频率和堆占用趋势 jstack 看线程状态(排查死锁、线程堆积) 结合 -XX:+HeapDumpOnOutOfMemoryError 让 OOM 时自动 dump
四、并发进阶:从 volatile 到线程池
14. volatile 三大特性,缺一不可
15. CAS 原理 + ABA 问题
16. 线程池七大参数 + 执行流程
17. 线程的生命周期
18. synchronized vs ReentrantLock
lockInterruptibly() | ||
tryLock(timeout) | ||
夜雨聆风