HashMap-----put方法详解

本文对比了Java 1.7和1.8中HashMap的put操作,阐述了它们在数组初始化、链表与红黑树转换上的关键区别,重点在于扩容机制和覆盖逻辑的变化。

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

hashMap.put(key,value)---entry对象---根据计算hash值---按位与----得到下标 jdk1.7 put ---判断数组是否为空,如果为空进行初始化,初始化的是数组容量(@Q6:必须为2的幂次方) ---判断key是否为空,执行方法,key为null存在index为0的位置 ---根据key得到hash,对key进行hashcode,(@Q9进行右移和异或运算) ---根据hash值和容量得到下标,indexFor方法(@Q6hash值s与容量-1进行按位与操作) ---覆盖逻辑,遍历链表,短路与先判断hash值是否相等,再判断key,value覆盖,返回oldvalue ---addEntry(hash,key,value,i),先有(@Q6扩容机制),再根据四个值,头插法或尾插法插入 get ---判断key是否为空 ---根据key获得entry,计算hash值,得到下标,遍历链表,先比较hash再比较key,就得到了 ---根据entry获得value jdk1.8 1---判断数组是否为空,调用resize方法进行初始化(resize方法李有初始化逻辑和扩容逻辑) 1---判断数组元素是否为空(计算出下标得到的这个数组元素,其实就是头节点) 2---为空则添加新节点 1---数组元素不为空意味着存在一个或一个以上元素,则为链表或红黑树 2---判断hash值和key,短路与操作,是同一个节点则继续往下执行2,不是则执行判断3 3---判断是否为红黑树 4---是树,则添加新节点 4---不是树则为链表,遍历链表,判断是否为尾节点 5---是尾节点则添加新节点 4---判断hash和key,返回e执行下一步的2操作覆盖操作 2---同一个节点则执行覆盖操作,同jdk1.7 结果不是了添加新节点,就是因为相同所以覆盖原来的旧节点 jdk1.8先加数据再扩容,如果扩容可以解决链表太长问题就不变红黑树

1.7和1.8差不多流程都是 1.判断数组是否为空 2.遍历链表(1.8就是多加了遍历红黑树) 3.判断hash和key,相同则覆盖,不同就是加新元素

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员Brath

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值