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

