HashMap数据结构和原理
HashMap结构
hashMap 数组+链表+红黑树组成
数组
HashMap在初始化时,会有一个默认的初始容量(16),并且有一个加载因子(0.75)
HashMap的默认长度为16,是为了降低hash碰撞的几率
加载因子为0.75,扩容时,容量与加载因子的乘积为整数,从而简化计算和提高效率
链表
解决hash冲突,链表长度超过8转换为红黑树
红黑树(自平衡二叉树)
提高查询效率
尾插法
减少冲突引起的频繁扩容:
头插法会导致新元素总是被添加到链表的头部,这可能导致同一个桶中的链表变得非常长,从而增加查找、插入和删除元素的性能下降。尾插法将新元素追加到链表末尾,有助于保持链表长度较短,减少冲突引起的性能问题。
更适合并发操作
由于头插法可能导致多个线程在同一个桶的链表头部争夺锁,增加了竞争和锁的争用。尾插法减少了争夺同一个锁的概率,从而提高了并发性能。
保持插入顺序
尾插法有助于保持元素插入的顺序,这对于某些应用来说可能是重要的特性。当遍历HashMap时,元素的顺序与它们被插入的顺序相同。
hashMap线程不安全
多线程操作下,hashMap扩容rehash会导致死循环
ConcurrentHashmap线程安全
分段锁技术保证并发环境下的写操作
https://zhuanlan.zhihu.com/p/449337470