JDK1 8 HashMap resize原始碼解讀

2021-10-22 06:19:02 字數 1057 閱讀 1517

final node resize() 

// newcap = oldcap * 2 左移1位相當於原值*2 並且原長度大於16

else if ((newcap = oldcap << 1) < maximum_capacity &&

oldcap >= default_initial_capacity)

newthr = oldthr << 1; // double threshold

}// hashmap有參構造方法(即傳入initcapacity)此時原長度為0且閾值不為0(hashmap懶載入)

else if (oldthr > 0) // initial capacity was placed in threshold

newcap = oldthr;

// 無參構造方法生成,使用預設值作為容量和閾值 16 0.75

else

// 定義新的閾值

if (newthr == 0)

threshold = newthr;

@suppresswarnings()

// 建立新的node陣列

node newtab = (node)new node[newcap];

// 將類例項中的陣列引用位址換為新的陣列位址

table = newtab;

if (oldtab != null)

// 判斷hash與原長度位運算得到最高位的值為1

// 表示保留在新位置(原位置+原長度)

else

} while ((e = next) != null);

// 將原位置資料落地到新陣列中

if (lotail != null)

// 將新位置資料落地到新陣列中

if (hitail != null) }}

}}

return newtab;

}

對於jdk1.8中採用新的擴容方式(為什麼jdk1.7中採用了重新計算,jdk1.8中採用原位置和新位置(原位置+原長度)),可以參考:這篇文章寫得非常詳細

jdk1 8常用總結

1.查詢集合裡的第乙個物件 filter 例 查詢listlist 中username為小明的物件t list.stream filter findfirst 1 list.stream filter e 小明 equals e.getusername findfirst 2.查詢滿足條件的物件,並...

用jdk1 8還是用jdk11

2020年年初,公司cto要求我們採用最新版本jdk,甚至直接使用最新版kotlin。前兩天 2020年12月 我把公司 公升級到了jdk11 lts版本,但不是最新版jdk。如果不搞rocketmq,不會發現什麼問題,而且會感覺這是乙個很好的改進,編碼寫法改進了,甚至效能提高了 然後,一搞rock...

Java 方法引用(JDK1 8)

引用 物件引用,物件引用的本質在於為乙個物件起別名,即 不同的棧記憶體可以同時指向同一塊堆記憶體空間。與物件引用類似的情況是,方法引用,即 為方法設定別名。在jdk 1.8之中針對於方法引用提供有如下的四種形式 引用靜態方法 類名稱 static方法名稱 引用某個物件的方法 例項化物件 普通方法 引...