提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 一.当他为空时,
- 二.当填入的key值为空时:
- 三、剩余的处理
- 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 指向当前链表的始节点,也就是说当前节点现在在链表的第一个位置,简单来说即,先来的往后退。
一.当他为空时,
先将写入的数组大小变成大于给定容量的最小的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);