1. hashmap的底層是陣列和鍊錶,jdk1.8之後加了紅黑樹。
hashset的底層是hashmap, 其儲存的物件在key 裡面,
定義乙個虛擬的object物件作為hashmap的value,將此物件定義為static final。
private static final object present = new object();
hashmap的value 可以是 null, key 也可以 null.所以使用的是containkey來判斷是非存在某個key,而不能通過get(key).
初始容量, 載入因子。
預設容量等於初始最大容量 * 載入因子。
hashmap的內部陣列的預設長度16, 會自動擴容
存值的過程是:put(key,value):
hashcode() 和 equals()來判斷key, 如果存在則替換值,所以在便利的時候後者會覆蓋前者(key相同的時候)。
index陣列下標的計算方式:
length: hashmap的主幹部分(陣列tab)的長度
int index = hash() & length -1
tab[index]: node物件放的位置。
hashmap不是執行緒安全的
hashmap可以通過下面的語句進行同步:
map m = collections.synchronizemap(hashmap);
cocurrenthashmap對比hashmap在hashenty前面加了segment段
當鍊表的長度達到一定值(預設為8)之後,會轉換成紅黑樹的結構,如下圖:
hashmap在多執行緒寫入會導致死迴圈
cocurrenthashmap通過分段鎖的機制,實現了多執行緒寫入時的執行緒安全
下圖是鍊錶的長度達到預設值8之後轉為紅黑樹的過程:
currenthashmap 參考:
hashtable:
hashtable實現了map介面,具有同步的功能。
關於hashmap的一些操作
兩個hashmap比對值然後把相同的值儲存到list裡 for entryentry map.entryset public static mapdothing mapmap else return map3 public static void removenullvalue map map pr...
一些的總結
大學的教育模式是先教你原理,在教你怎麼用工具 而缺少樂趣,一般大牛 的思維模式都是這樣 先知道原理 在用工具 其實對於普通人來講,一般都是 知道原來還有這種利用方式?到 我要用工具來提高效率 廣用效率還不行 我要知道原理 誒好像現在工具滿足不了我的需要了,我要自己新增規則 新增的規則 以及滿足不了我...
HashMap裡的一些知識點
hashmap裡的k v值如何計算得到索引 先看演算法如下,以jdk1.8為例 int index hash arrays.length 1 hash為key的hashcode計算得到的,為什麼hashmap的陣列長度是2的整數冪呢,因為,以初始長度為16為例,16 1 15,15的二進位制數字00...