這是一篇對 transfer 方法的拾遺,關於之前那篇文章的一些一筆帶過,或者當時不知道的地方進行回顧。
int runbit = fh & n;
nodelastrun = f;
for (nodep = f.next; p != null; p = p.next)
}if (runbit == 0)
else
for (nodep = f; p != lastrun; p = p.next)
關鍵看上面注釋的**,如果 runbit 是 0,那麼就設定在低位節點,反之,如果是 1,設定在高位。
為什麼這麼設計呢?當時樓主一筆帶過,稱之為這個貌似沒有什麼特殊含義
,實在是愚蠢之極。
今天解釋一下。
這要從 concurrenthashmap 的取於下標演算法開始說起。
我們知道,在 putval 方法中,會通過取於物件的 hash 值獲取下標。具體**如下:
else if ((f = tabat(tab, i = (n - 1) & hash)) == null)
這個判斷在當時看來是沒有可能存在的。到現在也沒明白為什麼。。。。
如果有大佬知道,請指點一二。
ConcurrentHashMap的擴容與資料遷移
目錄 擴容的條件 transfer擴容 資料遷移 高低位的作用 while s long sc sizectl tab table null n tab.length maximum capacity else if u.compareandswapint this,sizectl,sc,rs re...
Arraylist原始碼分析擴容
成員變數 序列化id private static final long serialversionuid 8683452581122892189l 預設初始化容量 private static final int default capacity 10 空的陣列 private static fi...
ArrayList擴容原始碼分析
實際是維護了乙個object型別的陣列 transientobject elementdata transient表示瞬時,表示該屬性不會被序列化 建立arraylist時,呼叫無參構造時 初始elementdata容量為0,第一次新增時,擴容至10 如果需要再次擴容時,則擴容為1.5倍 建立arr...