hashmap,arrayList,concurrentHashMap扩容机制

发布时间 2023-10-15 15:20:54作者: 云中哥

HashMap 1.7和1.8扩容机制
在 Java 1.7 中,HashMap 的扩容机制是当容量超过负载因子与数组长度的乘积时就会进行扩容。默认负载因子为 0.75,即当数组长度为 n 时,当元素个数 size 超过 n * 0.75 时就会扩容。扩容时,数组长度会变为原来的 2 倍,并且将原来的元素重新计算哈希值,再散列到新数组中。

在 Java 1.8 中,HashMap 的扩容机制有了改进。当链表长度超过阈值(默认为 8)时,将链表转换为红黑树。如果红黑树节点数少于 6,则将红黑树转回为链表。这样可以减少因为过长的链表而导致的查找效率降低。在进行扩容时,1.8 版本不再使用重散列的方式,而是采用了新的方式进行扩容。具体地,扩容过程中,原数组中的每个元素会被复制到新的数组中,而不需要重新计算哈希值和重新散列。

总的来说,Java 1.8 中的 HashMap 扩容机制相比 Java 1.7 中的有了很大的改进,避免了一些性能瓶颈。同时,1.8 版本引入了红黑树来优化链表过长的情况,提高了查询效率。

 

ArrayList底层数据结构是数组,当创建ArrayList对象时,底层初始化了一个空数组,数组是Object类型,数组名是elementData。当第一次添加元素时,数组长度扩容为10。

当第11次添加时,会触发扩容机制,其实就是调用 grow方法,扩容为原数组长度的1.5倍。

每次扩容时,都是创建一个新数组,将老数组的元素通过 Arrays工具类复制到新数组中。elementData 指向了新数组

***扩容不是在老数组基础上拼接,而创建一个1.5倍长度的新数组,并把老数组的元素复制到新数组中。

 

ConcurrentHashMap扩容

https://blog.csdn.net/zzu_seu/article/details/106698150/