final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node<K,V>[] tab; Node<K,V> p; int n, i;
if ((tab = table) == null || (n = tab.length) == 0)//判断tab数组是不是空
n = (tab = resize()).length;//如果数组是空就初始化数组,n是数组长度初始化默认是16
if ((p = tab[i = (n - 1) & hash]) == null)//(n - 1) & hash这是为了计算坑位当n为2的m次幂的时候(n - 1) & hash与hash%n的结果是一样的
tab[i] = newNode(hash, key, value, null);//如果坑位没人就直接初始化
else {//否则坑位有人
Node<K,V> e; K k;
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))//判断hash相等key相等说明坑位是自己占了,替换value就可以了
e = p;
else if (p instanceof TreeNode)//判断是不是红黑树
e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
else {//否则就是链表
for (int binCount = 0; ; ++binCount) {//循环链表
if ((e = p.next) == null) {//如果子节点为空
p.next = newNode(hash, key, value, null);//就生成子节点挂到父节点
if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st//如果链表长度超过等于7
treeifyBin(tab, hash);//转成红黑树
break;//跳出循环
}
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))//判断hash相等key相等说明坑位是自己占了,替换value就可以了
break;
p = e;
}
}
if (e != null) { //如果e不为空说明有找到hash相等key相等的节点
V oldValue = e.value;//节点的旧值
if (!onlyIfAbsent || oldValue == null)
e.value = value;//替换新的值
afterNodeAccess(e);//空方法
return oldValue;//返回旧的指
}
}
++modCount;// 修改次数+1
if (++size > threshold)//如果大于了阙值就扩容
resize();
afterNodeInsertion(evict);//空方法
return null;
}
jdk1.8 hashmap.putVal源码
最新推荐文章于 2024-04-09 17:23:38 发布