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 表達式, 讓我們一起來看下具體的用法及其優缺點.
1 通過 keySet() 或 values() 方法遍歷
如果只需要獲取 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);
}
}
}
2 通過 keySet 的 get(key) 獲取值
如果需要同時獲取 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));
}
}
3 通過 entrySet 遍歷
通過對 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());
}
}
4 通過迭代器 Iterator 遍歷
上面的幾種遍歷方法都用了增強型 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();
}
}
5 通過 Lambda 表達式遍歷
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);
});
}
6 總結 - 遍歷 Map 的實踐建議
(1) 如果只獲取 key 或者 value, 推薦使用 keySet()
或 values()
方法;
(2) 如果需要同時獲取 key 和value, 推薦使用 entrySet;
(3) 如果需要在遍歷過程中刪除元素, 推薦使用 Iterator;
(4) 如果需要在遍歷過程中添加元素, 可以新建一個臨時 Map 存放新增的元素, 遍歷結束後, 再把臨時 Map 添加到原 Map 中.
版權聲明
本文版權歸原作者所有, 如有侵權, 請聯繫博主, 定當立即刪除.
若要轉載, 請在文章頁面明顯位置標明原始鏈接, 否則一切責任自負.