java 遍歷Map的5種方法示例詳解
Java中的Map是一種常見(jiàn)的數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)鍵值對(duì)。遍歷Map的方法主要有以下幾種:
1、使用 for 循環(huán)遍歷
Map<String, String> myMap = new HashMap<>();
myMap.put("key1", "value1");
myMap.put("key2", "value2");
for(Map.Entry<String, String> entry : myMap.entrySet()){
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ": " + value);
}運(yùn)行結(jié)果:
key1: value1
key2: value2
上面這個(gè)示例通過(guò)entrySet()方法獲取Map中所有鍵值對(duì)的集合,然后使用for循環(huán)遍歷該集合。在循環(huán)內(nèi)部,使用getKey()和getValue()方法分別獲取鍵和值。
2、使用 keySet、values 分別遍歷鍵和值
Map<String, String> myMap = new HashMap<>();
myMap.put("key1", "value1");
myMap.put("key2", "value2");
// 遍歷Map的鍵
for(String key : myMap.keySet()){
System.out.println(key);
}
// 遍歷Map的值
for(String value : myMap.values()){
System.out.println(value);
}運(yùn)行結(jié)果:
key1
key2
value1
value2
第一個(gè)遍歷,通過(guò)keySet()方法獲取Map中所有鍵的集合,然后使用for循環(huán)遍歷該集合。
第二個(gè)遍歷,通過(guò)values()方法獲取Map中所有值的集合,然后使用for循環(huán)遍歷該集合。
需要注意的是,在Java中,Map的鍵和值也可以是任意類型,但是在使用for-each循環(huán)或迭代器遍歷時(shí),需要使用泛型指定鍵值對(duì)的類型,并使用Map.Entry類來(lái)表示鍵值對(duì)。
3、使用迭代器 Iterator 遍歷
Map<String, String> myMap = new HashMap<>();
myMap.put("key1", "value1");
myMap.put("key2", "value2");
Iterator<Map.Entry<String, String>> iterator = myMap.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println(key + ": " + value);
}運(yùn)行結(jié)果:
key1: value1
key2: value2
這個(gè)方法使用了Java中的Iterator迭代器,遍歷Map中的所有鍵值對(duì)。
首先通過(guò)entrySet()方法獲取Map中所有鍵值對(duì)的集合,然后使用iterator()方法返回一個(gè)迭代器對(duì)象。
在循環(huán)中,使用hasNext()方法判斷是否還有下一個(gè)元素,如果有,則使用next()方法獲取該元素,并使用getKey()和getValue()方法分別獲取鍵和值。
需要注意的是,當(dāng)在遍歷Map的同時(shí)進(jìn)行修改操作時(shí),可能會(huì)拋出ConcurrentModificationException異常。為了避免這種情況,可以使用并發(fā)Map的實(shí)現(xiàn)類如ConcurrentHashMap。
4、使用 Lambda 表達(dá)式的 forEach
Java 8以及以上版本中,還可以使用 Lambda 表達(dá)式來(lái)遍歷Map:
Map<String, String> myMap = new HashMap<>();
myMap.put("key1", "value1");
myMap.put("key2", "value2");
// 遍歷Map的鍵值對(duì)
myMap.forEach((key, value) -> {
System.out.println(key + ": " + value);
});運(yùn)行結(jié)果:
key1: value1
key2: value2
在這個(gè)例子中,我們通過(guò)Lambda表達(dá)式定義了要執(zhí)行的操作,即輸出鍵和值。這種方法可以使代碼更加簡(jiǎn)潔。
需要注意的是,以上遍歷Map的示例僅適用于HashMap、TreeMap等實(shí)現(xiàn)了Map接口的類。對(duì)于ConcurrentHashMap、LinkedHashMap等其他實(shí)現(xiàn),可能有不同的遍歷方法或限制。
5、使用 Stream API遍歷
同樣是在Java 8及以上版本中,也可以使用 Stream API來(lái)遍歷Map。
// 遍歷Map的鍵值對(duì)
myMap.entrySet().stream()
.forEach(entry -> {
System.out.println(entry.getKey() + ": " + entry.getValue());
});
// 遍歷Map的鍵myMap.keySet().stream()
myMap.keySet().forEach(key -> {
System.out.println(key);
});
// 遍歷Map的值myMap.values().stream()
myMap.values().forEach(value -> {
System.out.println(value);
});運(yùn)行結(jié)果:
key1: value1
key2: value2
key1
key2
value1
value2
首先通過(guò)entrySet()方法獲取Map中所有鍵值對(duì)的集合,然后使用stream()方法將其轉(zhuǎn)換成一個(gè)流。在流上,可以使用forEach()方法對(duì)每個(gè)元素執(zhí)行指定的操作。
需要注意的是,在使用Stream API時(shí),應(yīng)該盡量避免進(jìn)行修改操作,因?yàn)橐坏?duì)源數(shù)據(jù)進(jìn)行了修改,會(huì)導(dǎo)致Stream計(jì)算結(jié)果不可預(yù)測(cè)。如果需要修改,應(yīng)該使用collect()方法將結(jié)果收集到一個(gè)新的數(shù)據(jù)結(jié)構(gòu)中。
需要注意的Map刪除操作
在Java中,執(zhí)行Map的刪除操作時(shí),需要注意不能使用for-each循環(huán)遍歷并刪除元素。這是因?yàn)?,在使用for-each循環(huán)遍歷Map時(shí),實(shí)際上是通過(guò)Map.entrySet()返回的Set集合來(lái)進(jìn)行遍歷的,而在使用Set集合的迭代器進(jìn)行遍歷時(shí),如果修改了集合中的元素(例如:刪除),則會(huì)拋出ConcurrentModificationException異常。
因此,在Java中執(zhí)行Map的刪除操作,一般使用迭代器或者直接指定key進(jìn)行刪除。
6、使用迭代器刪除Map中的某個(gè)元素:
Map<String, String> myMap = new HashMap<>();
myMap.put("key1", "value1");
myMap.put("key2", "value2");
Iterator<Map.Entry<String, String>> iterator = myMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
if (entry.getKey().equals("key1")) {
iterator.remove();
}
}或者使用remove方法指定key進(jìn)行刪除:
myMap.remove("key1");
需要注意的是,使用remove方法指定key進(jìn)行刪除時(shí),如果key不存在,remove方法會(huì)返回null并不會(huì)拋出異常。
最后總結(jié)
在 java 中,Map遍歷的方式主要有for循環(huán)、迭代器 Iterator 、Lambda 表達(dá)式遍歷的 forEach、Stream API 這幾種方式。
到此這篇關(guān)于java 遍歷Map的5種方法的文章就介紹到這了,更多相關(guān)java遍歷map內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
如何使用BeanUtils.copyProperties進(jìn)行對(duì)象之間的屬性賦值
這篇文章主要介紹了使用BeanUtils.copyProperties進(jìn)行對(duì)象之間的屬性賦值,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-05-05
jvm字符串常量池在什么內(nèi)存區(qū)域問(wèn)題解析
這篇文章主要介紹了jvm字符串常量池在什么內(nèi)存區(qū)域的問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
springboot之SpringApplication生命周期和事件機(jī)制解讀
這篇文章主要介紹了springboot之SpringApplication生命周期和事件機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06
java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析
這篇文章主要介紹了java中的類型自動(dòng)轉(zhuǎn)換機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
SpringBoot自定義啟動(dòng)界面的實(shí)現(xiàn)代碼
實(shí)現(xiàn)自定義啟動(dòng)動(dòng)畫是一項(xiàng)有趣的任務(wù),雖然Spring Boot本身不提供內(nèi)置的動(dòng)畫功能,但可以通過(guò)一些技巧來(lái)實(shí)現(xiàn),本文主要以Demo的形式展示,再者下面的Demo都可以聯(lián)合使用,需要的朋友可以參考下2024-07-07
mybatis 中 foreach collection的用法小結(jié)(三種)
這篇文章主要介紹了mybatis 中 foreach collection的用法小結(jié)(三種),需要的朋友可以參考下2017-10-10
使用JSONObject.toJSONString 過(guò)濾掉值為空的key
這篇文章主要介紹了使用JSONObject.toJSONString 過(guò)濾掉值為空的key,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03

