Map的幾種迭代

在java中有很多種方法來遍歷map。接下來我們就回顧下最常用的方法,並且比較下他們的優缺點。 各種map 在java中都實現了map接口,下面的方法適合任何一種map,只要是實現了map接口的。像hashmap,treemap,LinkeHashMap,Hashtable等等。
    
方法#1:通過通過循環entries 來遍歷map
        這種方法是最通用和效率比較好的方法。適合同時需要map的key 和value的情況。

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());
}
    由於foreach循環是在java5開始有的,所以這種方法適合比較新的版本。而且這個循環會拋空指針錯誤,如果你循環的map 爲null,所以使用時候要檢查是否爲null.

方法#2  通過循環key和value 來遍歷
如果你只是需要map的key或者values ,你可以循環遍歷entrySet的keySet或者values
Map<Integer, Integer> map = new HashMap<Integer, Integer>();

//iterating over keys only
for (Integer key : map.keySet()) {
    System.out.println("Key = " + key);
}

//iterating over values only
for (Integer value : map.values()) {
    System.out.println("Value = " + value);
}

方法#3 使用迭代器 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);
}

你可以使用同樣的方法去迭代keyset和values.

這種方法看起來很繁瑣,但是他有他的優勢。首先這個是唯一的使用老版本的map的迭代方法。其次這也是唯一一個允許在迭代過程中通過iterator.remove()來刪除map中的數據。如果你試圖在foreach方法中進行刪除操作,你會得到預料不到的結果。

從性能方面來說,這個方法與foreach循環相當。

方法#4 通過遍歷key來獲取對應的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);
}
這個方法可以認爲是方法#1的縮減版,但是從實際來看,這種方法是非常慢和效率低下的,因爲通過key來獲取value是比較耗時的。(這種方法對不同的map實現會比第一種方法慢20%--200%)。如何你有安裝findbugs,你就可以檢測到。鑑於效率來說,這個方法需要避免使用。

結論:

如何你只需要keys或者只需要values,使用方法#2.如果你是老的版本,並且有刪除操作的使用方法#3。其他使用#1.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章