首页 > 代码库 > HashMap源码阅读笔记——HashMap的实现原理浅析
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的实现原理浅析
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。