首页 > 代码库 > 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的实现原理浅析