總結(jié):
1.HashMap的默認(rèn)大小為16,即桶數(shù)組的默認(rèn)長度為16;
2.HashMap的默認(rèn)裝載因子是0.75;
3.HashMap內(nèi)部的桶數(shù)組存儲的是Entry對象,也就是鍵值對對象。
4.構(gòu)造器支持指定初始容量和裝載因子,為避免數(shù)組擴(kuò)容帶來的性能問題,建議根據(jù)需求指定初始容量。裝載因子盡量不要修改,0.75是個比較靠譜的值。
5.桶數(shù)組的長度始終是2的整數(shù)次方(大于等于指定的初始容量),這樣做可以減少沖突概率,提高查找效率。(可以從indexfor函數(shù)中看出,h&(length-1),若length為奇數(shù),length-1為偶數(shù)那么h&(length-1)結(jié)果的最后一位必然為0,也就是說所有鍵都被散列到數(shù)組的偶數(shù)下標(biāo)位置,這樣會浪費(fèi)近一半空間。另外,length為2的整數(shù)次方也保證了h&(length-1)與h%length等效).
6.HashMap接受null鍵;
7.HashMap不允許鍵重復(fù),但是值是可以重復(fù)的。若鍵重復(fù),那么新值會覆蓋舊值。
8.HashMap通過鏈表法解決沖突問題,每個Entry都有一個next指針指向下一個Entry,沖突元素(不是鍵相同,而是hash值相同)會構(gòu)成一個鏈表。并且最新插入的鍵值對始終位于鏈表首部。
9.當(dāng)容量超過閾值(threshold)時,會發(fā)生擴(kuò)容,擴(kuò)容后的數(shù)組是原數(shù)組的兩倍。擴(kuò)容操作需要開辟新數(shù)組,并對原數(shù)組中所有鍵值對重新散列,非常耗時。我們應(yīng)該盡量避免HashMap擴(kuò)容。
10.HashMap非線程安全。