get代码
put代码
扩容代码[code]//tab 旧哈希表//nextTab 新哈希表private final void transfer(Node[] tab, Node[] nextTab) { //1.计算每次迁移多少个槽 //n:哈希表长度(多少个槽) int n = tab.length, stride; //stride:每次负责迁移多少个槽 //NCPU: CPU核数 //如果是多核,每次迁移槽数 = 总槽数无符号右移3位(n/8)再除CPU核数 //每次最小迁移槽数 = MIN_TRANSFER_STRIDE = 16 if ((stride = (NCPU > 1) ? (n >>> 3) / NCPU : n) < MIN_TRANSFER_STRIDE) stride = MIN_TRANSFER_STRIDE; // subdivide range //2.如果新哈希表为空,说明是初始化 if (nextTab == null) { // initiating try { @SuppressWarnings("unchecked") Node[] nt = (Node[])new Node[n = bound || finishing) advance = false; //transferIndex= n || i + n >= nextn) { int sc; //如果完成迁移,设置哈希表、数量 if (finishing) { nextTable = null; table = nextTab; sizeCtl = (n >> 1); return; } //CAS 将sizeCtl数量-1 表示 一个线程迁移完成 if (U.compareAndSwapInt(this, SIZECTL, sc = sizeCtl, sc - 1)) { //如果不是最后一条线程直接返回 if ((sc - 2) != resizeStamp(n) = 0) { int runBit = fh & n; Node lastRun = f; //寻找lastRun节点 for (Node p = f.next; p != null; p = p.next) { int b = p.hash & n; if (b != runBit) { runBit = b; lastRun = p; } } //如果最后一次计算值是0 //lastRun节点以及后续节点计算值都是0构建成ln链表 否则 都是1构建成hn链表 if (runBit == 0) { ln = lastRun; hn = null; } else { hn = lastRun; ln = null; } //遍历构建ln、hn链表 (头插) for (Node p = f; p != lastRun; p = p.next) { int ph = p.hash; K pk = p.key; V pv = p.val; //头插:Node构造第四个参数是后继节点 if ((ph & n) == 0) ln = new Node(ph, pk, pv, ln); else hn = new Node(ph, pk, pv, hn); } //设置ln链表到i位置 setTabAt(nextTab, i, ln); //设置hn链表到i+n位置 setTabAt(nextTab, i + n, hn); //设置转发节点 setTabAt(tab, i, fwd); advance = true; } //3.2.4.2 树迁移 else if (f instanceof TreeBin) { TreeBin t = (TreeBin)f; TreeNode lo = null, loTail = null; TreeNode hi = null, hiTail = null; int lc = 0, hc = 0; for (Node e = t.first; e != null; e = e.next) { int h = e.hash; TreeNode p = new TreeNode (h, e.key, e.val, null, null); if ((h & n) == 0) { if ((p.prev = loTail) == null) lo = p; else loTail.next = p; loTail = p; ++lc; } else { if ((p.prev = hiTail) == null) hi = p; else hiTail.next = p; hiTail = p; ++hc; } } ln = (lc
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |