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