Java中遍歷Map的幾種方法總結
阿新 • • 發佈:2019-01-06
方法一 在for-each迴圈中使用entries來遍歷 這是最常見的並且在大多數情況下也是最可取的遍歷方式。在鍵值都需要時使用。
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());
}
注意:for-each迴圈在java 5中被引入所以該方法只能應用於java 5或更高的版本中。如果你遍歷的是一個空的map物件,for-each迴圈將丟擲NullPointerException,因此在遍歷前你總是應該檢查空引用。方法二 在for-each迴圈中遍歷
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); }
該方法比entrySet遍歷在效能上稍好方法三使用Iterator遍歷使用泛型:
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()); }
不使用泛型:
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);
}
方法四、通過鍵找值遍歷(效率低)
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);
}
java具體測試程式碼類:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
//迴圈遍歷map的方法
public class CircleMap {
public static void main(String[] args) {
Map<String, Integer> tempMap = new HashMap<String, Integer>();
tempMap.put("a", 1);
tempMap.put("b", 2);
tempMap.put("c", 3);
// JDK1.4中
// 遍歷方法一 hashmap entrySet() 遍歷
System.out.println("方法一");
Iterator it = tempMap.entrySet().iterator();
while (it.hasNext()) {
Map.Entry entry = (Map.Entry) it.next();
Object key = entry.getKey();
Object value = entry.getValue();
System.out.println("key=" + key + " value=" + value);
}
System.out.println("");
// JDK1.5中,應用新特性For-Each迴圈
// 遍歷方法二
System.out.println("方法二");
for (Map.Entry<String, Integer> entry : tempMap.entrySet()) {
String key = entry.getKey().toString();
String value = entry.getValue().toString();
System.out.println("key=" + key + " value=" + value);
}
System.out.println("");
// 遍歷方法三 hashmap keySet() 遍歷
System.out.println("方法三");
for (Iterator i = tempMap.keySet().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 迴圈輸出key
System.out.println("key=" + obj + " value=" + tempMap.get(obj));
}
for (Iterator i = tempMap.values().iterator(); i.hasNext();) {
Object obj = i.next();
System.out.println(obj);// 迴圈輸出value
}
System.out.println("");
// 遍歷方法四 treemap keySet()遍歷
System.out.println("方法四");
for (Object o : tempMap.keySet()) {
System.out.println("key=" + o + " value=" + tempMap.get(o));
}
System.out.println("11111");
// java如何遍歷Map <String, ArrayList> map = new HashMap <String,
// ArrayList>();
System.out
.println("java 遍歷Map <String, ArrayList> map = new HashMap
<String, ArrayList>();");
Map<String, ArrayList> map = new HashMap<String, ArrayList>();
Set<String> keys = map.keySet();
Iterator<String> iterator = keys.iterator();
while (iterator.hasNext()) {
String key = iterator.next();
ArrayList arrayList = map.get(key);
for (Object o : arrayList) {
System.out.println(o + "遍歷過程");
}
}
System.out.println("2222");
Map<String, List> mapList = new HashMap<String, List>();
for (Map.Entry entry : mapList.entrySet()) {
String key = entry.getKey().toString();
List<String> values = (List) entry.getValue();
for (String value : values) {
System.out.println(key + " --> " + value);
}
}
}
}
總結如果僅需要鍵(keys)或值(values)使用方法二。如果你使用的語言版本低於java 5,或是打算在遍歷時刪除entries,必須使用方法三。否則使用方法一(鍵值都要)。
關於效率問題:
如果你使用HashMap
同時遍歷key和value時,keySet與entrySet方法的效能差異取決於key的具體情況,如複雜度(複雜物件)、離散度、衝突率等。換言之,取決於HashMap查詢value的開銷。entrySet一次性取出所有key和value的操作是有效能開銷的,當這個損失小於HashMap查詢value的開銷時,entrySet的效能優勢就會體現出來。例如上述對比測試中,當key是最簡單的數值字串時,keySet可能反而會更高效,耗時比entrySet少10%。總體來說還是推薦使用entrySet。因為當key很簡單時,其效能或許會略低於keySet,但卻是可控的;而隨著key的複雜化,entrySet的優勢將會明顯體現出來。當然,我們可以根據實際情況進行選擇 只遍歷key時,keySet方法更為合適,因為entrySet將無用的value也給取出來了,浪費了效能和空間。在上述測試結果中,keySet比entrySet方法耗時少23%。 只遍歷value時,使用vlaues方法是最佳選擇,entrySet會略好於keySet方法。
如果你使用TreeMap
同時遍歷key和value時,與HashMap不同,entrySet的效能遠遠高於keySet。這是由TreeMap的查詢效率決定的,也就是說,TreeMap查詢value的開銷較大,明顯高於entrySet一次性取出所有key和value的開銷。因此,遍歷TreeMap時強烈推薦使用entrySet方法。