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 中.
感謝閱讀,公衆号 「瘦風的南牆」 ,手機端閱讀更佳,還有其他福利和心得輸出,歡迎掃碼關注🤝
本文系轉載,并在原文的基礎上做了一定的補充和修改。
如有侵權,請原作者聯系部落客,定當立即删除。
若要轉載,請在文章頁面明顯位置标明原始連結,否則一切責任自負。