底层源码分析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表容量
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值