
Entry 数组存储键值对,每个 Entry 包含 key、value、hash 和 next 指针。哈希冲突时,新元素以头插法加入链表头部,可能导致链表逆序甚至死循环(多线程扩容时) Node 数组,链表长度超过 8 且数组容量 ≥ 64 时,链表转为红黑树(时间复杂度从 O(n) 优化为 O(log n));当节点数 ≤ 6 时,红黑树退化为链表,避免频繁转换的资源浪费 <!--br {mso-data-placement:same-cell;}--> td {white-space:nowrap;border:0.5pt solid #dee0e3;font-size:10pt;font-style:normal;font-weight:normal;vertical-align:middle;word-break:normal;word-wrap:normal;}
特性 | JDK 1.7 | JDK 1.8 |
|---|---|---|
插入方式 | 头插法(链表逆序,扩容时可能死循环) 16 37 | 尾插法(避免逆序,解决死循环) 11 37 |
扩容触发时机 | 插入前扩容(可能无效扩容) 37 | 插入后检查扩容(减少无效扩容) 37 |
扩容逻辑 | 重新计算所有元素索引,链表元素顺序反转 16 | 优化索引计算(原位置或原位置+旧容量),保留顺序 37 59 |
线程安全性 | 非线程安全,多线程扩容可能导致死循环 11 | 仍非线程安全,但尾插法避免死循环 11 37 |
hash & (length-1)) JDK 1.8 的 HashMap 通过红黑树优化、尾插法和扩容逻辑改进,显著提升了高并发场景下的稳定性和性能。理解其底层数据结构差异及转换机制,有助于合理设计哈希函数、优化存储结构,并避免多线程问题。实际开发中,若需线程安全,应优先选择 ConcurrentHashMap
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。