HashMap 是Java開發(fā)中經常使用的數據結構。相信HashMap 的基本用法你已經很熟悉了考赛。那么我們該如何遍歷HashMap 呢?哪種遍歷方式的性能更好呢唧喉?本篇文章來為你解決這個疑惑八孝。
一鸠项、HashMap 遍歷
如果你了解一些HashMap 底層原理,那么你肯定知道HashMap 是一個存儲鍵值對的集合楼入,每個鍵值對叫Entry浅辙。Entry 組成的數組構成了整個HashMap 的主干。Entry 的索引是通過Hash()方法計算出來的记舆。因此Entry在數組內部是無序的(所以我們不能單純的用for語句有序遍歷)泽腮。那么我們該如何遍歷HashMap 呢?
1. 使用EntrySet遍歷
HashMap 的內部有一個EntrySet方法可以讓我們方便地獲取HashMap 數組內的所有Entry诊赊。假設我們有一個這樣的HashMap。
HashMap<String,Integer> map=new HashMap<String,Integer>();
我們可以這樣獲取EntrySet碘箍。
Set<Entry<String, Integer>> entrySet=map.entrySet();
這樣就得到了HashMap 中所有的Entry鲸郊。獲取Entry 之后遍歷就簡單多了秆撮。我們可以用foreach 語句遍歷
Set<Entry<String, Integer>> entrySet=map.entrySet();
for (Entry<String, String> entry : entrySet) {
System.out.println(entry.getKey()+":"+entry.getValue());
}
或者使用迭代器的方式:
Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println(entry.getKey()+":"+entry.getValue());
}
2.使用KeySet 遍歷
HashMap 中的KeySet方法可以將把Map中所有的鍵存入到set集合中职辨。再根據get方法,就可以獲取到每一個鍵對應的值喳资。 使用KeySet 遍歷的代碼如下:
for (String key : map.keySet()) {
System.out.println(key+":"+map.get(key));
}
補充一點骨饿,如果你想獲取Hashmap 中所有的value台腥,你可以用values 方法宏赘。該方法返回一個包含所有value 的collection。
Collection<String> collection = map.values();
System.out.println(collection);
二黎侈、性能比較
網上對這兩種遍歷方法進行性能比較的文章有很多察署,我在此就不詳細比較了。結論就是峻汉,使用EntrySet (也就是第一種方式)進行遍歷的性能更好贴汪,無論你是使用foreach還是迭代器,只要你用的是EntrySet 的方式就可以休吠。而KeySet的方式性能就很差扳埂,至于KeySet為什么性能很差,我們可以看看遍歷KeySet 時用到的get() 方法的源碼(JDK 1.6 ver)瘤礁。
public V get(Object key) {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
可以看出來阳懂,源碼先獲取了key 對應的hash值 ,然后根據hash值在HashMap 的Entry 數組內遍歷出hash值與key的hash值相等的Entry,并返回對應的Value岩调。所以get() 方法在獲取Value 的時候又進行了一次循環(huán),這導致了性能的下降缰揪。
三钝腺、總結
總結一下,我們介紹了兩種遍歷HashMap 的方法,一種是用EntrySet唁毒,另一種是用KeySet浆西。性能上EntrySet 優(yōu)于KeySet ,這是因為KeySet 的get方法在獲取Value 的時候需要進行遍歷久信。所以推薦遍歷HashMap 的時候使用EntrySet 的方法。