一问三不知之HashMap的put方法

HashMap在put操作时,根据Key的hashCode找到存储位置。若位置为空,JDK1.7和1.8会创建并插入Entry或Node。若不为空,1.7使用链表头插法,1.8则根据是链表还是红黑树进行插入,节点数超过8时链表转为红黑树。过程中会检查并更新已存在的Key。
摘要由CSDN通过智能技术生成

一、获取hash

HashMap在put方法中,它使用hashCode()和equals()方法。当我们通过传递key-value对调用put方法的时候,HashMap使用Key hashCode()和哈希算法来找出存储key-value对的索引。

二、索引下标位置元素为空

如果索引下标位置元素为空,则将key和value封装为对象,jdk1.7封装成entry对象,jdk1.8封装成node对象,插入到当前位置

三、索引下标位置元素不为空

1、jdk1.7版本时

jdk1.7的hashmap的数据结构为数组加链表,当hash冲突即下标元素不为空时,先判断是否需要扩容,如果需要就先扩容,如果不需要,则生成entry对象,使用头插法插入到链表当中。

2、jdk1.8版本时

jdk1.8的hashmap的数据结构为数组加链表加红黑树,在进行put方法的时候,会判断当前索引下标位置的node对象的类型,是链表node还是红黑树node。

如果此位置的node对象是链表node,则使用尾插法将key和value封装为一个链表node插入链表,插入之前需要遍历链表,遍历链表的过程中会判断是否存在当前key,如果存在则更新value,如果不存在则遍历完链表,将node对象插入到链表的最后位置,插入后会看到链表的节点数,如果节点数大于8,则会将链表转化成红黑树。

如果此位置的node对象是红黑树node,则将key和value封装成红黑树node,放入红黑树的节点中,整个过程会判断是否存在当前key,如果存在则更新value。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值