1. 程式人生 > >HashMap底層及實現原理

HashMap底層及實現原理

HashMap---->儲存資料----->這些資料一定在計算機的底層----->儲存的方式(資料結構)

 

HashMap的儲存方式是 :陣列+連結串列

 

預設長度16。他的預設長度寫法:1<<4,因為2進位制語言是計算機底層語言所以直接用唯一了

為什麼預設長度是16?

因為在計算位置的時候採用得是code%(changdu-1)二進位制,而15的二進位制是1111,它可以很好的分散資料。而16也是一個稍微剛好的容量,所以採用了16.

 

節點的位置到底存在哪?怎麼得來了

節點的位置通過hashcode(key)的二進位制數,然後再把前十六位和後十六位進行一下移位,與預設長度-1的二進位制進行&運算。判斷出在哪個下標

 

 

為什麼不等到16在進行擴容?

因為如果等到16在進行擴容的化,會造成資料過多,以及連結串列過長,導致效率下降

 

為什麼這個因子是0.75?

去了時間複雜度和空間複雜度的平均值

 

擴容的機制:陣列的大小乘以0.75

 

連結串列陣列的改變:改成紅黑樹,當連結串列的長度大於8時改成紅黑樹,當連結串列長度小於6時,變成單鏈表

 

擴容機制的時候,怎樣進行擴容?

首先先判段是否是首次擴容,也就是集合是否為空,如果為空,則不需要進行資料遷移,如果不為空,則通過兩層迴圈進行擴容,外層迴圈時首先判斷改陣列是否為空,如果是空則不進行,然後再進行一層判斷,判斷是否是紅黑樹的形式,如果是則以紅黑樹的形式進行遷移,如果不是,則判斷該節點處在哪個位置(用的機制是code與擴容前的陣列長度(不是減一後的例如:16)進行與運算,如果最前的一位是1,則把該元素的位置向後+擴容前的陣列長度,否則不變)。