天天看點

[轉載] Java 周遊 Map 的 5 種方式

Map 是 Java 中使用非常廣泛的一類集合, 對于它的周遊通路, 有多種方法, 本篇轉載記錄常見的5種方法, 并給出各自的适用場景作為參考.

目錄

  • 1 通過 keySet() 或 values() 方法周遊
  • 2 通過 keySet 的 get(key) 擷取值
  • 3 通過 entrySet 周遊
  • 4 通過疊代器 Iterator 周遊
  • 5 通過 Lambda 表達式周遊
  • 6 總結 - 周遊 Map 的實踐建議
  • 版權聲明

版權聲明: 本文為轉載文章, 轉載時有适量修改. 再次轉載時請附上原文出處連結和本聲明.

作者:zhaoguhong(趙孤鴻)

出處:http://www.cnblogs.com/zhaoguhong

Java 中周遊 Map 有多種方法, 從最早的疊代器 Iterator, 到 JDK 5 開始支援的增強型 for 循環 —— 即 foreach, 再到 JDK 8 的 Lambda 表達式, 讓我們一起來看下具體的用法及其優缺點.

如果隻需要擷取 Map 的 key 或者 value, 通過 Map 的

keySet()

values()

方法無疑是最友善的:

public class TestMap {
    /**
     * Map 的擴容比較消耗性能, 是以若能确定存儲資料的大小,
     * 在初始化時指定初始容量是一個不錯的實踐技巧
     */
    private static Map<Integer, Integer> map = new HashMap<>(16);

    /** keySet 擷取 key */
    public void testKeySet() {
        for (Integer key : map.keySet()) {
          System.out.println(key);
        }
    }
    /** values 擷取 value */
    public void testValues() {
        for (Integer value : map.values()) {
            System.out.println(value);
        }
    }
}
           

如果需要同時擷取 key 和 value, 可以通過先擷取 key, 然後再通過 Map 的

get(key)

擷取對應的 value.

注意: 該方法不是最優選擇, 一般不推薦使用.

/** keySet get(key) 擷取key and value */
    public void testKeySetAndGetKey() {
        for (Integer key : map.keySet()) {
            System.out.println(key + ":" + map.get(key));
        }
    }
           

通過對 Map 的 entrySet 進行周遊, 也可以同時拿到 key 和 value.

該方法是最常用的周遊 Map 的方法, 大多情況下, 其性能要優于第2種.

/** 
    * entrySet 擷取 key 和 value, Entry 是 Map 内部存儲資料的邏輯容器
    */ 
  public void testEntry() {
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }
  }
           

上面的幾種周遊方法都用了增強型 for 循環 —— foreach, 這是 JDK 5 開始才有的特性.

foreach

的操作雖然看起來很簡潔, 但有一個劣勢: 周遊 Map 時, 如果改變其大小, 就會抛出并發修改異常. 但如果在周遊時隻需要删除 Map 中的元素, 那就可以用 Iterator 的

remove()

方法删除元素:

/** Iterator 擷取 key 和 value */
    public void testIterator() {
        Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry<Integer, Integer> entry = it.next();
            System.out.println(entry.getKey() + ":" + entry.getValue());
            // 删除元素
            // it.remove();
        }
    }
           

JDK 8 提供了 Lambda 表達式支援, 其文法看起來更簡潔, 可以同時拿到 key 和 value.

不過, 經過簡單的測試, Lambda 表達式周遊 Map 的速度要低于 entrySet 周遊的方式, 是以更推薦用 entrySet 去周遊 Map.

/** Lambda 擷取key and value */
    public void testLambda() {
        map.forEach((key, value) -> {
            System.out.println(key + ":" + value);
        });
    }
           

(1) 如果隻擷取 key 或者 value, 推薦使用

keySet()

values()

方法;

(2) 如果需要同時擷取 key 和value, 推薦使用 entrySet;

(3) 如果需要在周遊過程中删除元素, 推薦使用 Iterator;

(4) 如果需要在周遊過程中添加元素, 可以建立一個臨時 Map 存放新增的元素, 周遊結束後, 再把臨時 Map 添加到原 Map 中.

感謝閱讀,公衆号 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝

本文系轉載,并在原文的基礎上做了一定的補充和修改。

如有侵權,請原作者聯系部落客,定當立即删除。

若要轉載,請在文章頁面明顯位置标明原始連結,否則一切責任自負。