hashmap的put方法jdk1.7

本文详细介绍了HashMap在key为空时的处理方式,包括初始化容量与阈值设置,以及当key不为空时的存储过程,如计算hash值、确定存储位置、处理链表冲突等。同时,阐述了HashMap在达到阈值时的扩容策略,确保高效存储与查找。
摘要由CSDN通过智能技术生成

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

一.当他为空时,

先将写入的数组大小变成大于给定容量的最小的2倍数值,

int capacity = roundUpToPowerOf2(toSize);

然后扩充threshold的阈值

threshold = (int) Math.min(capacity * loadFactor, MAXIMUM_CAPACITY + 1);

实例化table对象

  table = new Entry[capacity];

二.当填入的key值为空时:

在索引为0的位置进行遍历,当存在值时,更新值返回旧值

for (Entry<K,V> e = table[0]; e != null; e = e.next) {
            if (e.key == null) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

当不存在值时添加节点

addEntry(0, null, value, 0);

三、剩余的处理

1.通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值

2.通过计算出的hash 值去调用 indexFor 方法计算当前对象应该存储在数组的几号位置

3.判断size 是否已经达到了当前阈值,如果没有,继续;如果已经达到阈值,则先进行数组扩容,将数组长度扩容为原来的2倍。

4.将当前对应的 hash,key,value封装成一个 Entry,去数组中查找当前位置有没有元素,如果没有,放在这个位置上;如果此位置上已经存在链表,那么遍历链表,如果链表上某个节点的 key 与当前key 进行 equals 比较后结果为 true,则把原来节点上的value 返回,将当前新的 value替换掉原来的value,如果遍历完链表,没有找到key 与当前 key equals为 true的,就把刚才封装的新的 Entry中next 指向当前链表的始节点,也就是说当前节点现在在链表的第一个位置,简单来说即,先来的往后退。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值