标签:ble hash 容量 使用 长度 amp class 算法 put
在java8发布以前,HashMap的实现简单来说就是一个Node数组,通过hash算法尽可能的分散了元素的位置,当一个位置有超过一个元素时,用链表的形式将元素进行连接。在java8中HashMap的实现形式有了一些改动,其中比较重要的一点就是链表的阈值,当链表的长度大于等于7时,会将这个位置的链表转换为红黑树的形式,如下图。
在来说说hash算法,HashMap中使用的算法如下
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
这个hash先将key右移了16位,然后与key进行异或,这里还涉及到后面put方法中的另一次&操作,
tab[i = (n - 1) & hash]
tab既是table,n是map集合的容量大小,hash是上面方法的返回值。因为通常声明map集合时不会指定大小,或者初始化的时候就创建一个容量很大的map对象,所以这个通过容量大小与key值进行hash的算法在开始的时候只会对低位进行计算,虽然容量的2进制高位一开始都是0,但是key的2进制高位通常是有值的,因此先在hash方法中将key的hashCode右移16位在与自身异或,使得高位也可以参与hash,更大程度上减少了碰撞率。
标签:ble hash 容量 使用 长度 amp class 算法 put
原文地址:http://www.cnblogs.com/ayanami-rei/p/5997088.html