HashMap JDK8底层原理与高频面试题
核心知识点1. 数据结构升级数组链表红黑树JDK8JDK8之前数组链表 → JDK8数组链表红黑树 当链表长度超过8且数组长度≥64时自动转为红黑树查找效率从O(n)降到O(logn)2. 初始容量与加载因子默认初始容量16加载因子0.75触发扩容的阈值比例扩容机制容量翻倍16→32→64...最大容量2^303. 扰动函数Hash算法优化java复制// JDK8的hash实现 static final int hash(Object key) { int h; return (key null) ? 0 : (h key.hashCode()) ^ (h 16); }将高低16位异或让hash分布更均匀减少哈希碰撞4. 扩容核心机制java复制// JDK8优化的扩容迁移链表拆分为高低两组 if ((e.hash oldCap) 0) { // 新增到原索引位置 newTab[j oldCap] (e.hash oldCap) 0 ? low : high; }JDK8采用尾插法避免了JDK7头插法导致的死循环问题5. 线程安全问题HashMap线程不安全高并发场景用ConcurrentHashMapJDK7分段锁JDK8CASsynchronized锁Node节点可运行代码java复制易错点与注意事项坑点说明put返回值为nullkey不存在返回null存在返回旧valuekey为null只能有一个HashMap允许一个null keyHashtable不允许数组长度必须是2的幂实际创建时找 expectedSize 的最小2次幂红黑树转链表阈值链表长度6时退化为链表hashCode相同≠equals相同先hash定位桶再遍历链表用equals比较应用场景缓存实现— 本地缓存、热点数据存储去重处理— Set场景用HashSet底层也是HashMap快速查找— 替代数据库查询的内存索引分布式ID生成— 基于Snowflake的机器ID存储