天天看點

HashMap源碼分析 jdk1.7 個人了解總結

HashMap源碼分析 jdk1.7 個人了解總結

寫部落格是因為之前本地的筆記老是容易丢失,是以現在抽空把能找到的搬運到部落格上,也是為了日後便于檢視。個人了解,很可能有錯誤,大家批判着看

HashMap源碼分析

1.資料結構:數組加連結清單

2.構造方法:初始化容量,加載因子

3.put方法:

1)第一次put的時候,初始化數組,數組大小是2的幂次方,預設16(算index的時候先算key的hash值,再用&的方法取index值)

2)擴容resize,建立一個數組,新數組的大小是舊數組的兩倍;複制資料使用頭插法,這就決定了HashMap不是線程安全的

節點Entry

key和value都可以為null,key為null的時候放在table[0]處,新的(null,value)會在table[0]處覆寫舊的value;table的每個節點是entity對象

其他小知識點

map的key最好用Integer或者String類型,因為這兩種資料類型是final的,不會被修改,每次算出來的hash的值不會變。

如果換成object,object中的屬性修改了,這個object就已經改變了,而object的位址可能不變,hashcode可能也不會變。

ArrayList:數組實作,預設初始容量10,擴容加50%

LinkList:雙向連結清單實作,尾插法,沒有初始化大小,沒有擴容,直接追加

Vector:數組實作,跟ArrayList一樣,隻是加了synchronized,保證線程安全,擴容翻倍

HashTable:跟HashMap一樣,隻是每個方法加了synchronized,key不能為null

繼續閱讀