final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
Node[] tab;
Node p;
int n, i;
//此处会有线程安全。
if ((tab =table) ==null || (n = tab.length) ==0) {
//如果数组为空,进行数组初始化
n = (tab = resize()).length;
}
if ((p = tab[i = (n -1) & hash]) ==null) {
//通过位运算,获取i 的下标,判断是否有元素,如果没有重新创建一个。
tab[i] = newNode(hash, key, value, null);
}else {
Node e;
K k;
//如果值相等,进行值得替换。
if (p.hash == hash && ((k = p.key) == key || (key !=null && key.equals(k)))) {
e = p;
}else if (pinstanceof TreeNode) {
//判断节点的类型是不是树,将元素插入到树中。
e = ((TreeNode) p).putTreeVal(this, tab, hash, key, value);
}else {
//如果节点的类型是数组。(binCount 链表得长度。)
for (int binCount =0; ; ++binCount) {
//如果链表最后一个元素等于空得时候进行了尾插入。
if ((e = p.next) ==null) {
//进行尾插入。
p.next = newNode(hash, key, value, null);
//当链表长度是8的时候进行树化。
if (binCount >=TREEIFY_THRESHOLD -1) {
// -1 for 1st
treeifyBin(tab, hash);
}
break;
}
if (e.hash == hash && ((k = e.key) == key || (key !=null && key.equals(k)))) {
break;
}
p = e;
}
}
if (e !=null) {
// existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue ==null) {
e.value = value;
}
afterNodeAccess(e);
//将老的值return
return oldValue;
}
}
++modCount;
//当前数组元素的个数。
if (++size >threshold) {
//进行扩容。
resize();
}
afterNodeInsertion(evict);
return null;
}