Java核心知识体系与集合扩容机制深度解析
一、Java基础核心知识图谱(对应图1)
包装器类型
自动拆装箱原理:
Integer.valueOf()
缓存机制(-128~127)性能陷阱:频繁拆箱导致的隐式对象创建
String核心机制
String
不可变性 vsStringBuffer
/StringBuilder
线程安全差异JVM字符串常量池优化(
intern()
方法的作用)
异常体系
Error
(系统级)与Exception
(可处理)的区别最佳实践:避免吞没异常,使用自定义异常
二、集合框架深度解析(对应图2)
1. ArrayList扩容机制
底层结构:动态数组(Object[] elementData
)
扩容流程:
// JDK源码关键逻辑
int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍扩容
elementData = Arrays.copyOf(elementData, newCapacity);
性能优化:
预估数据量时指定初始容量(
new ArrayList(100)
)避免多次扩容导致数组拷贝开销
2. HashMap扩容与哈希冲突解决
底层结构演进:
JDK7:数组+链表(头插法,可能死循环)
JDK8+:数组+链表/红黑树(尾插法,树化阈值=8)
扩容触发条件:
if (++size > threshold) resize(); // 2倍扩容并rehash
哈希优化技巧:
重写
hashCode()
与equals()
保证一致性使用
LinkedHashMap
维护插入顺序
3. 并发集合对比
集合类 | 线程安全实现方式 | 适用场景 |
---|---|---|
| 方法级 | 遗留系统(性能差) |
| 写时复制数组 | 读多写少场景 |
| 分段锁+CAS | 高并发K-V存储 |
三、高阶技术关联分析
反射与动态代理
动态代理实现原理(JDK Proxy vs CGLIB字节码增强)
Spring AOP的底层支撑技术
Lambda/Stream性能考量
中间操作(
filter/map
)的延迟执行特性并行流(
parallelStream
)的线程池风险
四、面试高频问题
HashMap多线程扩容为什么可能导致死循环?(JDK7头插法详解)
ArrayList和LinkedList在内存占用上的差异?
如何设计一个线程安全的缓存类?(结合WeakHashMap与ConcurrentHashMap)
总结:理解集合扩容机制需结合JVM内存模型(如数组拷贝开销)、数据结构(红黑树平衡逻辑)、并发编程(CAS+volatile)等多维度知识。建议通过JOL工具
观察对象内存布局,结合源码调试加深理解。