Java中遍歷Map的多種方法示例及優(yōu)缺點(diǎn)總結(jié)
前言
關(guān)于java中的map遍歷有多種方法,從最早的Iterator,到j(luò)ava5支持的foreach,再到j(luò)ava8 Lambda,讓我們一起來看下具體的用法以及各自的優(yōu)缺點(diǎn)
先初始化一個(gè)map
public class TestMap {
public static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
}
keySet values
如果只需要map的key或者value,用map的keySet或values方法無疑是最方便的
// 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);
}
}
keySet get(key)
如果需要同時(shí)獲取key和value,可以先獲取key,然后再通過map的get(key)獲取value
需要說明的是,該方法不是最優(yōu)選擇,一般不推薦使用
// keySet get(key) 獲取key and value
public void testKeySetAndGetKey() {
for (Integer key : map.keySet()) {
System.out.println(key + ":" + map.get(key));
}
}
entrySet
通過對map entrySet的遍歷,也可以同時(shí)拿到key和value,一般情況下,性能上要優(yōu)于上一種,這一種也是最常用的遍歷方法
// entrySet 獲取key and value
public void testEntry() {
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
Iterator
對于上面的幾種foreach都可以用Iterator代替,其實(shí)foreach在java5中才被支持,foreach的寫法看起來更簡潔
但I(xiàn)terator也有其優(yōu)勢:在用foreach遍歷map時(shí),如果改變其大小,會(huì)報(bào)錯(cuò),但如果只是刪除元素,可以使用Iterator的remove方法刪除元素
// Iterator entrySet 獲取key and 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(); 刪除元素
}
}
Lambda
java8提供了Lambda表達(dá)式支持,語法看起來更簡潔,可以同時(shí)拿到key和value,不過,經(jīng)測試,性能低于entrySet,所以更推薦用entrySet的方式
// Lambda 獲取key and value
public void testLambda() {
map.forEach((key, value) -> {
System.out.println(key + ":" + value);
});
}
簡單性能測試
用10萬條數(shù)據(jù),做了一個(gè)簡單性能測試,數(shù)據(jù)類型為Integer,map實(shí)現(xiàn)選取HashMap
static {
for (int i = 0; i < 100000; i++) {
map.put(i, 1);
}
}
測試結(jié)果如下:
KeySet: 392 Values: 320 keySet get(key): 552 entrySet: 465 entrySet Iterator:508 Lambda: 536
需要說明的是,map存儲(chǔ)的數(shù)據(jù)類型,map的大小,以及map的不同實(shí)現(xiàn)方式都會(huì)影響遍歷的性能,所以該測試結(jié)果僅供參考
總結(jié)
- 如果只是獲取key,或者value,推薦使用keySet或者values方式
- 如果同時(shí)需要key和value推薦使用entrySet
- 如果需要在遍歷過程中刪除元素推薦使用Iterator
- 如果需要在遍歷過程中增加元素,可以新建一個(gè)臨時(shí)map存放新增的元素,等遍歷完畢,再把臨時(shí)map放到原來的map中
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
SpringBoot 如何實(shí)現(xiàn)異步編程
在SpringBoot的日常開發(fā)中,一般都是同步調(diào)用的,但實(shí)際中有很多場景非常適合使用異步來處理,本文就詳細(xì)的介紹一下SpringBoot 如何實(shí)現(xiàn)異步編程 ,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12
java實(shí)時(shí)監(jiān)控文件行尾內(nèi)容的實(shí)現(xiàn)
這篇文章主要介紹了java實(shí)時(shí)監(jiān)控文件行尾內(nèi)容的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-02-02
數(shù)據(jù)結(jié)構(gòu)與算法之手撕排序算法
排序算法看似簡單,其實(shí)不同的算法中蘊(yùn)涵著經(jīng)典的算法策略。通過熟練掌握排序算法,就可以掌握基本的算法設(shè)計(jì)思想,本文主要介紹了Java中的排序算法,需要的朋友歡迎閱讀2023-04-04
IDEA如何使用spring-Initializr快速搭建SpringBoot
這篇文章主要介紹了IDEA如何使用spring-Initializr快速搭建SpringBoot問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05

