数据结构:数组+链表/红黑树 (链表大于8 转为红黑树) 一 keyhashcode 的高16与低16 异或 主要是让高16参与运算 static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
二 初始化table
tab = resize()
数组长度减一 与hash 得到数组下标
tab[i = (n - 1) & hash])
该数组下标为空时
tab[i] = newNode(hash, key, value, null);
否则 判断
if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) 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 treeifyBin(tab, hash); break; } if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; }
尾插入
扩容:
if (e.next == null) newTab[e.hash & (newCap - 1)] = e; else if (e instanceof TreeNode) ((TreeNode<K,V>)e).split(this, newTab, j, oldCap); do { next = e.next; if ((e.hash & oldCap) == 0) { if (loTail == null) loHead = e; else loTail.next = e; loTail = e; } else { if (hiTail == null) hiHead = e; else hiTail.next = e; hiTail = e; }
(e.hash & oldCap) == 0 数组链表下标不变 否则 数组链表下标 newTab[j + oldCap]