Java中Map的五種遍歷方式實(shí)現(xiàn)與對比
提起Java中Map的遍歷,很多人第一反應(yīng)還是: for (Map.Entry<K,V> entry : map.entrySet()) 。但其實(shí)Map遍歷藏著多種玩法,有的優(yōu)雅簡潔,有的性能拉滿,今天咱們盤一盤這些進(jìn)階偏基礎(chǔ)的遍歷方式,告別重復(fù)又臃腫的代碼~
一、先搞懂:Map遍歷的核心目標(biāo)
遍歷Map本質(zhì)是獲取「鍵(Key)」、「值(Value)」或「鍵值對(Entry)」,不同場景對應(yīng)不同遍歷方式,先上基礎(chǔ)準(zhǔn)備代碼:
import java.util.HashMap;
import java.util.Map;
public class MapTraversalDemo {
public static void main(String[] args) {
Map<String, Integer> fruitPrice = new HashMap<>();
fruitPrice.put("蘋果", 10);
fruitPrice.put("香蕉", 5);
fruitPrice.put("橙子", 8);
// 各種遍歷方式寫在這里~
}
}
二、幾種遍歷方式的對比
1. 傳統(tǒng)EntrySet遍歷(最通用)
這是最基礎(chǔ)也最常用的方式,支持同時(shí)獲取鍵和值,兼容所有Java版本:
// 方式1:普通for循環(huán)+EntrySet
for (Map.Entry<String, Integer> entry : fruitPrice.entrySet()) {
String key = entry.getKey();
Integer value = entry.getValue();
System.out.println(key + ":" + value + "元");
}
2. Lambda表達(dá)式遍歷(Java 8+,極簡)
Java 8引入的forEach+Lambda,一行代碼搞定,告別冗余:
// 方式2:Lambda+forEach fruitPrice.forEach((key, value) -> System.out.println(key + ":" + value + "元"));
3. 只遍歷Key/Value(按需選擇)
如果只需要鍵或值,不用遍歷EntrySet,直接針對性獲?。?/p>
// 只遍歷Key
for (String key : fruitPrice.keySet()) {
System.out.println("水果:" + key);
}
// 只遍歷Value
for (Integer value : fruitPrice.values()) {
System.out.println("價(jià)格:" + value + "元");
}
4. 迭代器遍歷(支持刪除元素)
如果遍歷過程中需要?jiǎng)h除元素,迭代器是安全選擇(foreach遍歷刪除會拋異常):
// 方式4:迭代器遍歷(支持刪除)
Iterator<Map.Entry<String, Integer>> iterator = fruitPrice.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, Integer> entry = iterator.next();
if (entry.getValue() < 8) {
iterator.remove(); // 安全刪除價(jià)格低于8的水果
}
}
System.out.println("刪除后的Map:" + fruitPrice);
三、避坑提醒
1. 遍歷過程中修改Map(如put/remove):除了迭代器的remove方法,其他方式可能觸發(fā) ConcurrentModificationException ;
2. 性能優(yōu)先級:EntrySet遍歷 > 分別遍歷Key+getValue(后者會重復(fù)查詢Map);
3. Lambda遍歷雖然簡潔,但無法在內(nèi)部使用break/continue終止遍歷。
到此這篇關(guān)于Java中Map的五種遍歷方式實(shí)現(xiàn)與對比的文章就介紹到這了,更多相關(guān)Java Map遍歷內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中l(wèi)ombok的@Builder注解的解析與簡單使用詳解
這篇文章主要介紹了Java中l(wèi)ombok的@Builder注解的解析與簡單使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01
Java中實(shí)現(xiàn)Comparable和Comparator對象比較
這篇文章主要針對Java中Comparable和Comparator對象進(jìn)行比較,感興趣的小伙伴們可以參考一下2016-02-02
springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解
這篇文章主要介紹了springboot 使用poi進(jìn)行數(shù)據(jù)的導(dǎo)出過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
Java中Collection和Collections的區(qū)別
Collection是一個(gè)集合接口,集合類的頂級接口,Collections是一個(gè)包裝類,本文主要介紹了Java中Collection和Collections的區(qū)別,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04
Springboot整合FreeMarker的實(shí)現(xiàn)示例
本文主要介紹了Springboot整合FreeMarker的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02

