HashMap在jdk7和jdk8中的实现原理 以及LinkedHashMap的实现原理

本文详细解析了HashMap在JDK7和JDK8中的实现原理,包括数组+链表+红黑树的数据结构变化,以及LinkedHashMap如何通过Entry[]数组+双向链表保持插入顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

HashMap

jdk7中的实现原理:

     HashMap map = new HashMap();

     1.假设创建hashMap(key1,value1),初始化时会创建一个默认长度为16的Entry[]数组

       map.put(key1,value1)

     2.向map中执行put操作时,首先会调用key1所在类的hashCode()方法计算出hash值,此hash值经过某种算法计算出key1在Entry[]数组中的存储位置,

        如果此位置上为空,则直接存放value1;

        如果此位置上不为空,则先比较key的哈希值,若key1哈希值与所有存在的哈希值都不同,则key1-value1添加成功,若哈希值与存在的某一个数据的哈希值相同,则调用equals方法比较(若返回false,则添加成功,若返回true,则替换掉比较的数据)。

      3.扩容:当超出临界值且存放的位置非空时,容量扩充为原来的2倍,并将原来的数据复制过来

jdk8与jdk7不同的实现原理

      1.实例化时,并没有创建Entry[]数组,而是在首次put值时创建Node[]数组

      2.jdk7中底层结构只有数组+链表,而jdk8中底层结构时数组+链表+红黑树。

         jdk8中当某一个位置上的链表形式的数据个数大于8且数组长度大于64时,此时这个位置上的链表形式转化为红黑树形式。

LinkedHashMap

      实现原理:创建Entry[]数组+双重链表,能够记录添加的元素的先后顺序

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值