Java中Map的五種遍歷方式實(shí)現(xiàn)與對(duì)比
提起Java中Map的遍歷,很多人第一反應(yīng)還是: for (Map.Entry<K,V> entry : map.entrySet()) 。但其實(shí)Map遍歷藏著多種玩法,有的優(yōu)雅簡(jiǎn)潔,有的性能拉滿,今天咱們盤一盤這些進(jìn)階偏基礎(chǔ)的遍歷方式,告別重復(fù)又臃腫的代碼~
一、先搞懂:Map遍歷的核心目標(biāo)
遍歷Map本質(zhì)是獲取「鍵(Key)」、「值(Value)」或「鍵值對(duì)(Entry)」,不同場(chǎng)景對(duì)應(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);
// 各種遍歷方式寫在這里~
}
}
二、幾種遍歷方式的對(duì)比
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+,極簡(jiǎn))
Java 8引入的forEach+Lambda,一行代碼搞定,告別冗余:
// 方式2:Lambda+forEach fruitPrice.forEach((key, value) -> System.out.println(key + ":" + value + "元"));
3. 只遍歷Key/Value(按需選擇)
如果只需要鍵或值,不用遍歷EntrySet,直接針對(duì)性獲取:
// 只遍歷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遍歷刪除會(huì)拋異常):
// 方式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)先級(jí):EntrySet遍歷 > 分別遍歷Key+getValue(后者會(huì)重復(fù)查詢Map);
3. Lambda遍歷雖然簡(jiǎn)潔,但無法在內(nèi)部使用break/continue終止遍歷。
到此這篇關(guān)于Java中Map的五種遍歷方式實(shí)現(xiàn)與對(duì)比的文章就介紹到這了,更多相關(guān)Java Map遍歷內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)戰(zhàn)項(xiàng)目 醫(yī)院預(yù)約掛號(hào)系統(tǒng)
本文是一個(gè)Java語言編寫的實(shí)戰(zhàn)項(xiàng)目,是一個(gè)醫(yī)院預(yù)約掛號(hào)系統(tǒng),主要用到了jdbc+jsp+mysql+ajax等技術(shù),技術(shù)含量比較高,感興趣的童鞋跟著小編往下看吧2021-09-09
SpringBoot如何動(dòng)態(tài)改變?nèi)罩炯?jí)別
這篇文章主要介紹了SpringBoot如何動(dòng)態(tài)改變?nèi)罩炯?jí)別,幫助大家更好的理解和使用springboot框架,感興趣的朋友可以了解下2020-12-12
java之TreeUtils生成一切對(duì)象樹形結(jié)構(gòu)案例
這篇文章主要介紹了java之TreeUtils生成一切對(duì)象樹形結(jié)構(gòu)案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09

