當在Java中創建Map或List時,它們都具有相同的默認初始容量10.它們的容量隨着獲取新元素而增長。然而,只有在添加第11個元素時List纔會增長,並且在添加第8個元素時Map已經增長。發生這種情況的原因是Map有一個loadFactor字段,它調節了它可以「飽和」的程度。當飽和度高於loadFactor時,地圖增長。 loadFactor默認爲0.75。爲什麼Map有loadFactor而List沒有它?
我想知道爲什麼列表和地圖有不同的機制來決定何時增加其初始容量?
當在Java中創建Map或List時,它們都具有相同的默認初始容量10.它們的容量隨着獲取新元素而增長。然而,只有在添加第11個元素時List纔會增長,並且在添加第8個元素時Map已經增長。發生這種情況的原因是Map有一個loadFactor字段,它調節了它可以「飽和」的程度。當飽和度高於loadFactor時,地圖增長。 loadFactor默認爲0.75。爲什麼Map有loadFactor而List沒有它?
我想知道爲什麼列表和地圖有不同的機制來決定何時增加其初始容量?
Map
s具有負載因數,因爲負載因數決定了它們的性能。當你降低負載因子時,你會獲得更好的性能(但你需要爲增加的內存使用付費)。
以HashMap
爲例。容量是支持陣列的大小。但是,陣列的每個位置可能包含多個條目。加載因子控制平均有多少條目將存儲在單個陣列位置。
另一方面,在ArrayList
backing數組的每個索引都包含一個元素,所以對於加載因子沒有任何意義。
Map
因爲沒有loadFactor - 只有基於某種HashMap
的實現纔有它(例如,TreeMap
上沒有loadFactor)。
這是爲什麼?
A HashMap
包含許多「桶」,當添加或檢索條目時,您獲取密鑰的哈希碼並計算您必須將其放入或檢索到的桶。根據哈希實現的質量,兩個不同的對象可能會在同一個桶中結束。當發生這種情況時,hashmap會啓動一個鏈接列表,您在檢索條目時必須經歷這個鏈接列表。
的HashMap
和List
的不同之處的一些要點:
HashMap
不說有多少elemnts可以存儲在它的capacity
,它的桶的數量。從理論上講,您可以在HashMap
中存儲超過capacity
條目。HashMap
的性能不利。如果您擁有的存儲桶數量較少,則會增加此類衝突的數量。輸入loadFactor:如果事情變得「太緊張」,並且擔心會發生太多的碰撞,那麼您就會開始增加桶的數量 - 即使還剩下一些空的。
當然,'TreeMap'沒有加載因子/容量,'LinkedList'沒有容量,總是按需增長。 – Kayaman
增加一個更重要的點。加載因子是散列表在其容量自動增加之前被允許獲得的滿量程的度量。當哈希表中條目的數量超過負載因子與當前容量的乘積時,哈希表將被重新哈希。 –