HashMap源码阅读笔记——HashMap的实现原理浅析
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap源码阅读笔记——HashMap的实现原理浅析相关的知识,希望对你有一定的参考价值。
在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,更大程度上减少了碰撞率。
以上是关于HashMap源码阅读笔记——HashMap的实现原理浅析的主要内容,如果未能解决你的问题,请参考以下文章