国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Java 中九種 Map 的遍歷方式,你一般用的是哪種呢?

開發 前端
我們可以看到這種方式相對于 map.entrySet() 方式,多了一步 get 的操作,這種場景比較適合我們只需要 key 的場景,如果也需要使用 value 的場景不建議使用 map.keySet() 來進行遍歷,因為會多一步 map.get() 的操作。

日常工作中 Map 絕對是我們 Java 程序員高頻使用的一種數據結構,那 Map 都有哪些遍歷方式呢?這篇文章阿粉就帶大家看一下,看看你經常使用的是哪一種。

通過 entrySet 來遍歷

1、通過 for 和 map.entrySet() 來遍歷

第一種方式是采用 for 和 Map.Entry 的形式來遍歷,通過遍歷 map.entrySet() 獲取每個 entry 的 key 和 value,代碼如下。這種方式一般也是阿粉使用的比較多的一種方式,沒有什么花里胡哨的用法,就是很樸素的獲取 map 的 key 和 value。

public static void testMap1(Map<Integer, Integer> map){
long sum = 0;
for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
sum += entry.getKey() + entry.getValue();
}
System.out.println(sum);
}

看過 HashMap 源碼的同學應該會發現,這個遍歷方式在源碼中也有使用,如下圖所示,

圖片

putMapEntries 方法在我們調用 putAll 方法的時候會用到。

圖片

2、通過 for, Iterator 和 map.entrySet() 來遍歷

我們第一個方法是直接通過 for 和 entrySet() 來遍歷的,這次我們使用 entrySet() 的迭代器來遍歷,代碼如下。

public static void testMap2(Map<Integer, Integer> map){
long sum = 0;
for (Iterator<Map.Entry<Integer, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
Map.Entry<Integer, Integer> entry = entries.next();
sum += entry.getKey() + entry.getValue();
}
System.out.println(sum);
}

3、通過 while,Iterator  和 map.entrySet() 來遍歷

上面的迭代器是使用 for 來遍歷,那我們自然可以想到還可以用 while 來進行遍歷,所以代碼如下所示。

public static void testMap3(Map<Integer, Integer> map){
Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
long sum = 0;
while (it.hasNext()) {
Map.Entry<Integer, Integer> entry = it.next();
sum += entry.getKey() + entry.getValue();
}
System.out.println(sum);
}

這種方法跟上面的方法類似,只不過循環從 for 換成了 while,日常我們在開發的時候,很多場景都可以將 for 和 while 進行替換。2 和 3 都使用迭代器 Iterator,通過迭代器的 next(),方法來獲取下一個對象,依次判斷是否有 next。

通過 keySet 來遍歷

上面的這三種方式雖然代碼的寫法不同,但是都是通過遍歷 map.entrySet() 來獲取結果的,殊途同歸。接下來我們看另外的一組。

4、通過 for 和 map.keySet() 來遍歷

前面的遍歷是通過 map.entrySet() 來遍歷,這里我們通過 map.keySet() 來遍歷,顧名思義前者是保存 entry 的集合,后者是保存 key 的集合,遍歷的代碼如下,因為是 key 的集合,所以如果想要獲取 key 對應的 value 的話,還需要通過 map.get(key) 來獲取。

public static void testMap4(Map<Integer, Integer> map){
long sum = 0;
for (Integer key : map.keySet()) {
sum += key + map.get(key);
}
System.out.println(sum);
}

5、通過 for,Iterator 和 map.keySet() 來遍歷

public static void testMap5(Map<Integer, Integer> map){
long sum = 0;
for (Iterator<Integer> key = map.keySet().iterator(); key.hasNext(); ) {
Integer k = key.next();
sum += k + map.get(k);
}
System.out.println(sum);
}

6、通過 while,Iterator 和 map.keySet() 來遍歷

public static void testMap6(Map<Integer, Integer> map){
Iterator<Integer> it = map.keySet().iterator();
long sum = 0;
while (it.hasNext()) {
Integer key = it.next();
sum += key + map.get(key);
}
System.out.println(sum);
}

我們可以看到這種方式相對于 map.entrySet() 方式,多了一步 get 的操作,這種場景比較適合我們只需要 key 的場景,如果也需要使用 value 的場景不建議使用 map.keySet() 來進行遍歷,因為會多一步 map.get() 的操作。

Java 8 的遍歷方式

注意下面的幾個遍歷方法都是是 JDK 1.8 引入的,如果使用的 JDK 版本不是 1.8 以及之后的版本的話,是不支持的。

7、通過 map.forEach() 來遍歷

JDK 中的 forEach 方法,使用率也挺高的。

public static void testMap7(Map<Integer, Integer> map){
final long[] sum = {0};
map.forEach((key, value) -> {
sum[0] += key + value;
});
System.out.println(sum[0]);
}

該方法被定義在 java.util.Map#forEach 中,并且是通過 default 關鍵字來標識的,如下圖所示。這里提個問題,為什么要使用 default 來標識呢?歡迎把你的答案寫在評論區。

圖片

8、Stream 遍歷

public static void testMap8(Map<Integer, Integer> map){
long sum = map.entrySet().stream().mapToLong(e -> e.getKey() + e.getValue()).sum();
System.out.println(sum);
}

9、ParallelStream 遍歷

public static void testMap9(Map<Integer, Integer> map){
long sum = map.entrySet().parallelStream().mapToLong(e -> e.getKey() + e.getValue()).sum();
System.out.println(sum);
}

這兩種遍歷方式都是 JDK 8 的 Stream 遍歷方式,stream 是普通的遍歷,parallelStream 是并行流遍歷,在某些場景會提升性能,但是也不一定。

測試代碼

上面的遍歷方式有了,那么我們在日常開發中到底該使用哪一種呢?每一種的性能是怎么樣的呢?為此阿粉這邊通過下面的代碼,我們來測試一下每種方式的執行時間。

public static void main(String[] args){
int outSize = 1;
int mapSize = 200;
Map<Integer, Integer> map = new HashMap<>(mapSize);
for (int i = 0; i < mapSize; i++) {
map.put(i, i);
}
System.out.println("---------------start------------------");
long totalTime = 0;
for (int size = outSize; size > 0; size--) {
long startTime = System.currentTimeMillis();
testMap1(map);
totalTime += System.currentTimeMillis() - startTime;
}
System.out.println("testMap1 avg time is :" + (totalTime / outSize));
// 省略其他方法,代碼跟上面一致
}

為了避免一些干擾,這里通過外層的 for 來進行多次計算,然后求平均值,當我們的參數分別是 outSize = 1,mapSize = 200 的時候,測試的結果如下

圖片

圖片

當隨著我們增大 mapSize 的時候,我們會發現,后面幾個方法的性能是逐漸上升的。

圖片

圖片

總結

從上面的例子來看,當我們的集合數量很少的時候,基本上普通的遍歷就可以搞定,不需要使用 JDK 8 的高級 API 來進行遍歷,當我們的集合數量較大的時候,就可以考慮采用 JDK 8 的 forEach 或者 Stream 來進行遍歷,這樣的話效率更高。在普通的遍歷方法中 entrySet() 的方法要比使用 keySet() 的方法好。

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2022-11-17 15:17:12

Java數據結構Map

2023-04-08 14:22:16

Spring初始化對象

2023-10-08 08:46:29

Java遍歷方式

2013-04-09 12:41:33

Java Map遍歷法Java

2025-03-26 00:35:25

2010-10-08 14:23:08

MySQL中INSER

2021-12-13 08:29:18

Code編程字體

2013-01-20 21:55:24

移動策略

2024-06-19 19:17:04

2023-10-30 09:46:08

接口重試技巧

2020-10-26 14:03:07

混合云云計算云遷移

2020-06-09 08:09:07

機器學習統計學習無監督學習

2016-12-19 14:35:10

機器人工作

2020-04-08 15:59:23

顯卡Linux命令

2011-12-28 10:10:54

2012-07-25 14:25:08

PrismPrism4MVVM

2010-02-04 17:49:04

C++參數傳遞

2018-01-08 15:07:15

java項目后臺

2016-10-19 14:37:09

2023-01-13 07:41:20

BeanSpring容器
點贊
收藏

51CTO技術棧公眾號

亚洲高清三级视频| 欧美乱大交xxxxx| 妞干网在线视频观看| 免费久久99精品国产自在现线| 国产精品欧美一区二区| 国产精品chinese在线观看| 亚洲精品456在线播放狼人| 都市激情在线视频| 欧美日韩国产在线| 午夜av电影| 亚洲国产精品久久久久婷婷884| 黄色手机在线视频| 国产欧美一区二区三区在线看蜜臀 | 正在播放一区二区| 亚洲精品一区二区三区蜜桃久| 欧美黄色视屏| 亚洲激情成人| 日韩成人av在线| 91xxxxx| 在线看片不卡| 亚洲一区二区在线观看视频| 国产精品大全| 国产精品任我爽爆在线播放| 日本在线观看天堂男亚洲| 免费观看成人性生生活片| 亚洲综合日韩中文字幕v在线| 综合久久综合| 国产精品久久久久久久久久东京 | 久久精品女人天堂av免费观看| 日韩三级视频中文字幕| 在线看女人毛片| 精品国产乱码久久久久久老虎 | 亚洲三级av| 91精品国产91久久久久久吃药 | 国产亚洲精品美女久久久| 户外露出一区二区三区| 色妞久久福利网| 91精品短视频| 国产成人综合一区二区三区| 日韩av免费大片| 97久久精品午夜一区二区| 亚洲精品四区| 自拍偷拍视频在线| 欧美极品美女视频| 日韩欧美在线观看一区二区| 日韩一区二区三区精品视频 | 精品国产乱码久久久久久果冻传媒| 国产精品十八以下禁看| 国产一区视频在线观看免费| 日韩免费电影一区二区| 粉嫩久久99精品久久久久久夜| 欧在线一二三四区| 亚洲已满18点击进入久久| 精品推荐蜜桃传媒| 亚洲美女免费精品视频在线观看| 国产无遮挡裸体免费久久| 亚洲最大福利视频| 国产裸体歌舞团一区二区| 激情校园亚洲图片| 欧美人体做爰大胆视频| 偷拍精品精品一区二区三区| 欧洲亚洲妇女av| 国产一区二区三区久久| 国产原创中文在线观看 | 欧美日韩一区成人| 韩漫成人漫画| 国产精品高清在线观看| 美女性感视频久久| 欧美1819sex性处18免费| 欧美一区二区视频在线观看2020| 日韩中文字幕| 玛丽玛丽电影原版免费观看1977| 久久综合九色综合97_久久久| 久久久pmvav| 日韩在线视频国产| 亚洲毛片在线| 五月天亚洲激情| 亚洲精品av在线| 国产精品99久久| 狠狠操精品视频| 精品久久久久av影院| 免费精品国产的网站免费观看| 亚洲欧美丝袜| 狠狠躁夜夜躁久久躁别揉| 国产精品天堂蜜av在线播放| 久久精品aaaaaa毛片| 一区二区三区自拍| 福利视频亚洲| 午夜精品视频在线观看一区二区| 亚洲成a天堂v人片| 中文字幕一区二区三区四区久久| 相泽南亚洲一区二区在线播放 | 国产成人一区二区三区别| 五月激情综合婷婷| 国产精品毛片无码| 亚洲高清不卡一区| 黑人极品videos精品欧美裸| 999久久久久久久久6666| 日本福利视频导航| 欧美一区二区三区公司| 日韩欧美国产精品综合嫩v| 91精品91久久久中77777老牛| 日韩亚洲欧美成人一区| 99久久99热这里只有精品| 午夜精品久久久久久久无码| 日韩美女一区二区三区| 欧美日韩影院| 亚洲美女在线免费观看| 韩国三级日本三级少妇99| 成人精品一区二区三区中文字幕| 美足av综合网| 欧美性xxxx69| 欧美老肥妇做.爰bbww| 国产高清一区| 麻豆影视在线观看| 欧美亚洲日本网站| 国产欧美一二三区| 成人豆花视频| 欧美 国产 综合| 在线观看精品自拍私拍| 久久精品噜噜噜成人av农村| 黄色在线播放网站| 国产精品久久久久久久小唯西川| 一区二区三区视频在线看| 欧美日韩麻豆| 2018av男人天堂| 欧洲精品在线视频| 亚洲女女做受ⅹxx高潮| 少妇久久久久| 美女一级全黄| 国产在线播放91| 婷婷中文字幕综合| 中文字幕人成人乱码| 欧洲一区av| 国产精品一级久久久| 这里是久久伊人| 免费高清在线视频一区·| 成人免费网站观看| 成年人网站国产| 欧美黑人一级爽快片淫片高清| 亚洲欧洲精品天堂一级| 色婷婷色综合| 网友自拍视频在线| 亚洲成人在线视频网站| 亚洲人成电影网站色xx| 91蝌蚪porny九色| 日韩福利视频一区| 午夜亚洲成人| 久久爱av电影| 亚洲新中文字幕| 中文字幕不卡在线观看| 成人久久电影| 国产精品实拍| 国产精品久久久影院| 欧美大学生性色视频| 亚洲天堂福利av| 欧美 日韩 国产精品免费观看| 中国日本在线视频中文字幕| 国产精品jizz在线观看老狼| 欧美老女人xx| 亚洲自拍另类综合| 黄色av日韩| 另类专区亚洲| 羞羞的视频网站| y111111国产精品久久婷婷| 欧美大片在线观看一区| 91在线视频网址| 国产精品精品| 亚洲天堂导航| 区一区二日本| 亚洲精品在线视频观看| 另类视频在线观看| 日韩欧美在线一区| 日韩av中文字幕一区二区三区| 久久婷婷五月综合色丁香| 99热在线网站| 中文字幕一区二区三区精彩视频| 欧美黄网免费在线观看| 欧美日韩一卡二卡| 国产v综合v亚洲欧| 久久精品亚洲人成影院| 国产另类xxxxhd高清| 玖玖在线免费视频| 蜜臀av.com| 成人春色激情网| 中国china体内裑精亚洲片| 亚洲线精品一区二区三区八戒| 精品伊人久久久久7777人| 日韩激情毛片| 老色鬼在线视频| 午夜刺激在线| 大陆av在线播放| 99中文字幕| 97免费视频在线| 亚洲激情视频在线观看| 午夜a成v人精品| 久久九九久久九九| 美女在线视频一区| 天天做天天爱天天综合网| 亚洲精品乱码日韩|