jdk1.8中HashMap扩容和JDK1.7HashMap扩容的区别说明

书欣 Java经验 发布时间:2022-09-28 22:58:14 阅读数:10488 1
下文笔者讲述HashMap在jdk1.8版本中的扩容方法分享,如下所示
jdk1.8和jdk1.7在HashMap的扩容上步骤一摸一样
只是JDK1.8引入了红黑树

JDK1.8HashMap和JDK1.7HashMap扩容的区别

  
1.两者底层存储结构不同: 
     1.7是数组+链表
	 1.8是数组+链表+红黑树结构;

2. jdk1.7中当哈希表为空时
    会先调用inflateTable()初始化一个数组
   jdk1.8则是直接调用resize()扩容

3. 插入键值对的put方法的区别
    1.8中会将节点插入到链表尾部
    1.7中是采用头插

4. jdk1.7中的hash函数对哈希值的计算直接使用key的hashCode值
   jdk1.8中则是采用key的hashCode异或上key的hashCode进行无符号右移16位的结果
    避免了只靠低位数据来计算哈希时导致的冲突
    计算结果由高低位结合决定,使元素分布更均匀;

5. 扩容时1.8会保持原链表的顺序
         1.7会颠倒链表的顺序
   1.8是在元素插入后检测是否需要扩容
   1.7则是在元素插入前

6. jdk1.8是扩容时通过hash&cap==0将链表分散
    无需改变hash值
   jdk1.7通过更新hashSeed来修改hash值达到分散的目的

7. 扩容策略
    jdk1.7中是只要不小于阈值就直接扩容2倍
    jdk1.8的扩容策略会更优化
     当数组容量未达到64时,以2倍进行扩容
     超过64之后若桶中元素个数不小于7就将链表转换为红黑树
     但如果红黑树中的元素个数小于6就会还原为链表
     当红黑树中元素不小于32的时候才会再次扩容。
 
相关阅读:
HashMap什么时候进行扩容---如何扩容呢?
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaJingYan/202209/16643771514539.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者