方法一:在for-each循環中使用entry來遍歷,經過Map.entrySet遍歷key和value,這是最多見的而且在大多數狀況下也是最可取的遍歷方式。在鍵值都須要時使用。java
Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(Map.Entry<Integer,Integer> entry:map.entrySet()){ System.out.println("key="+entry.getKey()+",value = "+entry.getValue()); }
注:Map.Entry方法解釋:Map.Entry是Map聲明的一個內部接口,此接口爲泛型,定義爲Entry<K,V>。它表示Map中的一個實體(一個key-value對) 數組
方法二:在for-each循環中遍歷keys或values,若是隻須要map中的鍵或者值,你能夠經過keySet或values來實現遍歷,而不是用entrySet。該方法比entrySet遍歷在性能上稍好(快了10%),並且代碼更加乾淨。性能
Map<Integer,Integer> map = new HashMap<Integer,Integer>(); //遍歷map中的鍵 for(Integer key:map.keySet()){ System.out.println("key="+key); } //遍歷map中的值 for(Integer value:map.values()){ System.out.println("value ="+value); }
方法三:使用Iterator遍歷spa
Map<Integer,Integer> map = new HashMap<Integer,Integer>(); Iterator<Map.Entry<Integer,Integer>> entries = map.entrySet().iterator(); while(entries.hasNext()){ Map.Entry<Integer,Integer> entry = entries.next(); System.out.println("key="+entry.getKey()+"value = "+entry.getValue()); }
不使用泛型code
Map map = new HashMap(); Iterator entries = map.entrySet().iterator(); while(entries.hasNext()){ Map.Entry entry = (Map.Entry)entries.next(); Integer key = (Integer)entry.getKey(); Integer value = (Integer)entry.getValue(); System.out.println("key = "+key+",value = "+value); }
你也能夠在keySet和values上應用一樣的方法。blog
該種方式看起來冗餘卻有其優勢所在。首先,在老版本java中這是唯一遍歷map的方式。另外一個好處是,你能夠在遍歷時調用iterator.remove()來刪除entries,另兩個方法則不能。根據javadoc的說明,若是在for-each遍歷中嘗試使用此方法,結果是不可預測的。接口
從性能方面看,該方法類同於for-each遍歷(即方法二)的性能。rem
方法四:經過鍵找值遍歷,這個代碼看上去更加乾淨;但實際上它至關慢且無效率。get
Map<Integer, Integer> map = new HashMap<Integer, Integer>(); for (Integer key : map.keySet()) { Integer value = map.get(key); System.out.println("Key = " + key + ", Value = " + value);
結論:hash
通常來說使用entrySet的方式進行遍歷是效率最高的,由於hashMap內部的存儲結構就是基於Entry的數組,在用這種方式進行遍歷時,只須要遍歷一次便可。而使用其餘方式的時間複雜度能夠會提升,例如:keySet方式,每次都須要經過key值去計算對應的hash,而後再經過hash獲取對應的結果值,所以效率較低。