1. 程式人生 > >淺談HashMap與其兩種遍歷方法

淺談HashMap與其兩種遍歷方法

雖然Map遍歷用的比較少,一般是根據Key用來查詢其Value,但是當我們不知道key的值的時候就需要對Map進行遍歷進行對比。
HashMap是Map的一種實現,用的也比較多,Map是一個介面,儲存Entry (key,value),HashMap裡面可以儲存null鍵和null值。
HashMap底層實現是陣列和連結串列的資料結構。
陣列中的元素儲存的是同一個Hash值的連結串列(hash值相等的key放在同一個陣列中)陣列長度為2的n次冪有助於減少Hash值的碰撞,其根據key的hash值找到在陣列中的位置,然後遍歷連結串列中是否有該key,有的話進行覆蓋value,否則新增到連結串列的表頭。
陣列的預設初始容量為16,當其超過容量的閾值預設為0.75時,會自動擴充為原來的2倍大小。

HashMap不是執行緒安全的。它用一個叫做fail-fast機制,不允許多個執行緒同時更改。
HashMap構造類
HashMap 包含如下幾個構造器:
HashMap():構建一個初始容量為 16,負載因子為 0.75 的 HashMap。
HashMap(int initialCapacity):構建一個初始容量為 initialCapacity,負載因子為 0.75 的 HashMap。
HashMap(int initialCapacity, float loadFactor):以指定初始容量、指定的負載因子建立一個 HashMap。
HashMap的基礎構造器HashMap(int initialCapacity, float loadFactor)帶有兩個引數,它們是初始容量initialCapacity和載入因子loadFactor。
initialCapacity:HashMap的最大容量,即為底層陣列的長度。
loadFactor:負載因子loadFactor定義為:散列表的實際元素數目(n)/ 散列表的容量(m)。
負載因子衡量的是一個散列表的空間的使用程度,負載因子越大表示散列表的裝填程度越高,反之愈小。對於使用連結串列法的散列表來說,查詢一個元素的平均時間是O(1+a),因此如果負載因子越大,對空間的利用更充分,然而後果是查詢效率的降低;如果負載因子太小,那麼散列表的資料將過於稀疏,對空間造成嚴重浪費。
HashMap**遍歷有兩種方法**:
方法1:使用entrySet

Map map = new HashMap(); 
Iterator iter = map.entrySet().iterator(); 
while (iter.hasNext()) { 
    Map.Entry entry = (Map.Entry) iter.next(); 
    Object key = entry.getKey(); 
    Object val = entry.getValue(); 
} 

方法2:使用keySet

Map map = new HashMap(); 
Iterator iter = map.keySet().iterator(); 
while
(iter.hasNext()) { Object key = iter.next(); Object val = map.get(key); }

兩種方法都可以遍歷整個map,但是方法1的速度上比方法2要快
因為方法1其實只要遍歷一次,得到entry就可以獲得key和value,而方法2其實要遍歷兩次,一次是轉為iterator,一次就從hashmap中取出key所對應的value,所以其速度比較慢。