博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA8 HashMap 新特性
阅读量:6605 次
发布时间:2019-06-24

本文共 1404 字,大约阅读时间需要 4 分钟。

1. 链表解决冲突的方式:
 
java中处理Hash散列后的冲突使用的是链表法:
    java8之前只是使用的简单Entry链表存储键值对。java8后,在Entry队列的长度大于8之后,会自动将队列转换成红黑树的存储,利用红黑树相对于链表更好的增改查效率来解决在出现较长链表时性能快速降低的问题。
图片来自美团技术团队
 
 
2. resize() 的方式:
    随着hashMap中数据量的增多,槽不够用的时候需要使用resize来增大槽的容量。此时,需要将所有的数据根据hash值重新散列(此处有著名的死循环问题)。
    java7之前,元素的重新散列需要重新使用hashCode 将元素重新散列。但是java8 中使用了一个非常巧妙的设计,使得不需要重新计算散列值可以快速得出在新表中的位置。原理如下:
    我们槽的容量cap是2的n-1次方,每次扩容都是在原来容量的大小上*2。也就是oldCap < 1。
    而散列的计算方式为(cap-1 & hash), 即hash的低n-1位。
    因此,新的散列位置相对于老的散列位置来说。只是扩容后第n位会对散列结果造成的影响。
    hash值的第n位有两种情况:
        1) hash值的第n位为0,则散列的位置不会变, 
        2) hash值的第n为为1,则散列结果增加了2的(n-1)次方,即oldCap + 原来的散列值。
 
        比如
        初始容量为2,即二进制10;
        有hash值为 1,2, 5, 6 的四个数。根据(cap-1 & hash),他们的散列位置分别为:
                           1,0, 1, 0
        扩容为4,即二进制100后,hash值第2位为1的散列位置加2(如2,6),为0的不变(如1, 5):
                           1,2, 1, 2
    代码如下:
Node
loHead = null, loTail = null; Node
hiHead = null, hiTail = null; Node
next; do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; } } while ((e = next) != null); if (loTail != null) { loTail.next = null; newTab[j] = loHead; } if (hiTail != null) { hiTail.next = null; newTab[j + oldCap] = hiHead; }

 

  

 
 
 
 
 
 
 

转载于:https://www.cnblogs.com/zekelai/p/5670584.html

你可能感兴趣的文章
ARR2.5 配置反向代理
查看>>
hdfs的FileSystem实例化
查看>>
uva 10878 - Decode the tape
查看>>
如何在列表,字典,集合中根据条件筛选数据
查看>>
js 随机数 转 http://www.cnblogs.com/banbu/archive/2012/07/25/2607880.html
查看>>
关于angular自定义组件在外面使用的时候异步的拉取数据传递给组件的问题
查看>>
hausaufgabe--python 17- Function definition
查看>>
【JOISC2019|2019】【20190622】cake3
查看>>
react(二)
查看>>
简单测试java - properties
查看>>
js中sort()方法的用法,参数以及排序原理
查看>>
对 set statistics time on的两个执行时间权威解释
查看>>
python print的用法
查看>>
JavaScript Math.abs() 函数
查看>>
过滤器 自定义查询
查看>>
格式化输出,%n.m
查看>>
Linux那些让你虎躯一震的命令
查看>>
ethereum/EIPs-1077 Executable Signed Messages
查看>>
跑步圣经(来自樊登读书会)
查看>>
SpringBoot环境搭建及第一个程序运行(详细!)
查看>>