底层源码分析HashMap的实现原理

HashMap的底层实现原理

① 以Jdk7为例进行说明:

HashMap map=new HashMap();
在实例化以后底层创建了一个长度是16的一维数组 Entry[] table.
在执行过很多次put之后...在调用map.put(key,value)
首先调用key所在类的hashcode方法计算哈希值,此哈希值经过某种算法计算以后,得到Entry数值的存放位置,如果此位置为空,则直接添加。--->添加成功 情况一
    如果此位置上的哈希值与key的哈希值不同,此时的key添加成功----> 情况二
    如果此位置上的哈希值与key的哈希值相同 继续比较会调用key所在类的equals()方法
        如果equals()返回false则添加成功------->情况三
        如果equals() 返回true则将key值所对应的value替换 此位置上的value


② 补充说明:关于情况二和情况三,此时的key和value和原来的数据是以链表的方式存储的。
    在不断的添加过程当中会设计扩容的问题,默认的扩容方法,扩容为原来的两倍,并将原来容器的数据赋值过来
③ JDK8 相较于JDk7在底层实现方面的不同
    new HashMap() 底层并没有创建一个长度为16的数组
    首次调用put()方法时,底层创建长度为16的数组

④ JDk7 的底层只有 数组+链表
    JDK 8 的底层当中使用的是数组+链表+红黑树(当数组某个索引位置上的元素个数 >8 且当数组的长度 >64 时)
    此索引位置上的存放形式从 链表变为红黑树

源码内部的一些关键字:Default_Initial_capacity:HaspMap的默认容量:16
                    Default_Load_FACTOR:hashMap的默认加载因子(决定链表长度的绝定因子 兼顾数组的利用率且链表不会太长):0.75
                    threshold:扩容的临界值:=容量*填充因子 16*0.75 >=12
                    TREEIFY_THRESHOLD 转化为红黑树:Bucket中链表长度大于该默认值,转化为红黑树:8
                    MIN_TREEIFY_CAPACITY: 桶(链表)中的Node被树华时最小的hash表容量

猜你喜欢

转载自blog.csdn.net/weixin_46351306/article/details/113774249