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

Java 中九種 Map 的遍歷方式

開發(fā) 前端
日常工作中 Map 絕對(duì)是我們 Java 程序員高頻使用的一種數(shù)據(jù)結(jié)構(gòu),從最早的Iterator,到j(luò)ava5支持的foreach,再到j(luò)ava8 Lambda,你經(jīng)常使用的是哪一種?

日常工作中 Map 絕對(duì)是我們 Java 程序員高頻使用的一種數(shù)據(jù)結(jié)構(gòu),從最早的Iterator,到j(luò)ava5支持的foreach,再到j(luò)ava8 Lambda,你經(jīng)常使用的是哪一種?

通過 entrySet 來遍歷

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

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

public static void testMap1(Map map) {

   long sum = 0;

   for (Map.Entry entry : map.entrySet()) {

   sum += entry.getKey() + entry.getValue();

   }

   System.out.println(sum);

   }

看過 HashMap 源碼的同學(xué)應(yīng)該會(huì)發(fā)現(xiàn),這個(gè)遍歷方式在源碼中也有使用,如下圖所示,

putMapEntries 方法在我們調(diào)用 putAll 方法的時(shí)候會(huì)用到。

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

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

public static void testMap2(Map map) {

   long sum = 0;

   for (Iterator> entries = map.entrySet().iterator(); entries.hasNext(); ) {

   Map.Entry entry = entries.next();

   sum += entry.getKey() + entry.getValue();

   }

   System.out.println(sum);

   }

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

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

public static void testMap3(Map map) {

   Iterator> it = map.entrySet().iterator();

   long sum = 0;

   while (it.hasNext()) {

   Map.Entry entry = it.next();

   sum += entry.getKey() + entry.getValue();

   }

   System.out.println(sum);

   }

這種方法跟上面的方法類似,只不過循環(huán)從 for 換成了 while,日常我們?cè)陂_發(fā)的時(shí)候,很多場(chǎng)景都可以將 for 和 while 進(jìn)行替換。2 和 3 都使用迭代器 Iterator,通過迭代器的 next(),方法來獲取下一個(gè)對(duì)象,依次判斷是否有 next。

通過 keySet 來遍歷

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

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

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

public static void testMap4(Map 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 map) {

   long sum = 0;

   for (Iterator 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 map) {

   Iterator it = map.keySet().iterator();

   long sum = 0;

   while (it.hasNext()) {

   Integer key = it.next();

   sum += key + map.get(key);

   }

   System.out.println(sum);

   }

我們可以看到這種方式相對(duì)于 map.entrySet() 方式,多了一步 get 的操作,這種場(chǎng)景比較適合我們只需要 key 的場(chǎng)景,如果也需要使用 value 的場(chǎng)景不建議使用 map.keySet() 來進(jìn)行遍歷,因?yàn)闀?huì)多一步 map.get() 的操作。

Java 8 的遍歷方式

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

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

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

public static void testMap7(Map map) {

   final long[] sum = {0};

   map.forEach((key, value) -> {

   sum[0] += key + value;

   });

   System.out.println(sum[0]);

   }

該方法被定義在 java.util.Map#forEach 中,并且是通過 default 關(guān)鍵字來標(biāo)識(shí)的,如下圖所示。

8、Stream 遍歷

public static void testMap8(Map map) {

   long sum = map.entrySet().stream().mapToLong(e -> e.getKey() + e.getValue()).sum();

   System.out.println(sum);

   }

9、ParallelStream 遍歷

 public static void testMap9(Map map) {

   long sum = map.entrySet().parallelStream().mapToLong(e -> e.getKey() + e.getValue()).sum();

   System.out.println(sum);

}

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

測(cè)試代碼

上面的遍歷方式有了,那么我們?cè)谌粘i_發(fā)中到底該使用哪一種呢?每一種的性能是怎么樣的呢?為此阿粉這邊通過下面的代碼,我們來測(cè)試一下每種方式的執(zhí)行時(shí)間。

public static void main(String[] args) {

   int outSize = 1;

   int mapSize = 200;

   Map 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 來進(jìn)行多次計(jì)算,然后求平均值,當(dāng)我們的參數(shù)分別是 outSize = 1,mapSize = 200 的時(shí)候,測(cè)試的結(jié)果如下

當(dāng)隨著我們?cè)龃?mapSize 的時(shí)候,我們會(huì)發(fā)現(xiàn),后面幾個(gè)方法的性能是逐漸上升的。

總結(jié)

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


責(zé)任編輯:華軒 來源: 今日頭條
相關(guān)推薦

2022-11-14 07:33:57

Java場(chǎng)景value

2023-10-08 08:46:29

Java遍歷方式

2013-04-09 12:41:33

Java Map遍歷法Java

2024-06-19 19:17:04

2011-12-28 10:10:54

2016-10-19 14:37:09

2023-01-13 07:41:20

BeanSpring容器

2015-04-22 12:08:16

JAVAMap問題

2020-11-20 14:02:22

HashMap遍歷Java

2021-08-09 13:24:32

數(shù)據(jù)分析大數(shù)據(jù)小企業(yè)

2022-06-28 10:22:00

機(jī)器學(xué)習(xí)網(wǎng)絡(luò)攻擊黑客

2025-03-26 00:35:25

2023-02-24 11:49:02

ChatGPT首席信息官

2023-06-14 08:54:09

Map方法ForEach方法

2022-03-18 09:42:54

JavaString

2024-07-09 08:27:52

2025-10-15 02:15:00

SpringBoot項(xiàng)目開發(fā)

2021-07-20 17:40:53

物聯(lián)網(wǎng)IOT

2016-12-19 14:35:10

機(jī)器人工作

2010-03-16 15:23:32

java動(dòng)態(tài)載入
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

日韩欧美国产综合在线| 激情五月综合网| 久久天天躁夜夜躁狠狠躁2022| 亚洲+小说+欧美+激情+另类 | 亚洲午夜久久| 国外成人免费视频| 久久综合中文字幕| av在线电影网| 久久九九亚洲综合| 中国女人久久久| 免费h片在线观看| 亚洲精品一区二三区不卡| 成人同人动漫免费观看| 17c丨国产丨精品视频| 欧美日韩国产黄| 国产精品扒开腿做爽爽爽视频软件| 国产精品都在这里| 精品午夜久久福利影院| 丝袜美女写真福利视频| 亚洲人成网站在线播| 综合一区在线| 四虎免费av| 国产一区二中文字幕在线看| 亚洲人成网亚洲欧洲无码| 欧美亚洲伦理www| 亚洲区综合中文字幕日日| 国产精品视频1区| 精品国产午夜| 99r国产精品视频| 天堂在线精品| 黑人巨茎大战欧美白妇| 色综合网色综合| 成人动态视频| 青青在线免费视频| 欧美一卡在线观看| 一区二区三区在线电影| 黄色片视频在线| 亚洲一级片在线看| 久久一区精品| √新版天堂资源在线资源| 国产精品色午夜在线观看| 日本一区二区成人| 欧美综合激情| 成人国产精品av| 亚洲精品国产a久久久久久| 澳门av一区二区三区| 国产精品久久久久aaaa九色| 国产精品无码电影在线观看| 美女黄毛**国产精品啪啪| 久久精品中文字幕| 国产一区二区三区免费| 亚洲一区精彩视频| 在线观看欧美黄色| 97精品视频| 少妇精品放荡导航| 91精品国产自产91精品| 久久久亚洲午夜电影| 天堂综合在线播放| 欧美久久在线观看| 中文字幕亚洲一区在线观看| 高清在线成人网| 最新日韩三级| 免费视频爱爱太爽了| 亚洲视频国产视频| 成人一区二区三区视频在线观看| 日韩精品av| 妞干网视频在线观看| 亚洲免费人成在线视频观看| 久久99国产精品免费| 天堂av在线网| 丁香六月激情网| 久久精品视频亚洲| 日本一区二区三区高清不卡| 99这里只有精品视频| 国产乱xxⅹxx国语对白| 国产精品成人播放| 亚洲最大成人综合| 欧美日韩综合| 日韩另类在线| 午夜欧美一区二区三区免费观看| 日韩精品一区二区三区老鸭窝| 久久精品国产99| 国产原创一区| 成人在色线视频在线观看免费大全| 欧美诱惑福利视频| 精品久久中文字幕久久av| 欧美在线视屏| 伊人精品影院| 成年人看的毛片| 久久久久久久影院| 午夜精品一区二区三区免费视频 | 免费av网页| 欧美精品一区在线播放| av一本久道久久综合久久鬼色| 91精品日本| 97影院在线观看| 国产91精品最新在线播放| 久久综合九色综合97婷婷女人| 成人免费网站视频| 精品在线视频一区二区三区| 欧美大片在线观看| 欧美精品九九| a视频在线免费看| 久久久久国产一区| caoprom在线| 337p亚洲精品色噜噜狠狠p| 精品国产自在精品国产浪潮| 亚洲女同ⅹxx女同tv| 欧美激情aⅴ一区二区三区| av片在线观看| 黄色大片中文字幕| 国产精品久久久av久久久| 欧美一区二区性放荡片| 99在线视频精品| 99热国内精品| 日韩不卡在线| 香蕉自在线视频| 欧美视频自拍偷拍| 欧美亚洲日本一区| 国产精品日日摸夜夜摸av| 青椒成人免费视频| 清纯唯美日韩| av日韩一区| 神马久久精品| 四虎影视精品成人| 久久偷看各类wc女厕嘘嘘偷窃| 色av中文字幕一区| 国产精品亲子乱子伦xxxx裸| 亚久久调教视频| 99久久婷婷这里只有精品| 亚洲精品一区av| 国产91欧美| 成人午夜视频免费在线观看| 亚洲色图狂野欧美| 亚洲精品午夜久久久| 欧美亚洲三区| 欧美自拍一区| 91禁在线看| 中文在线视频| 国产3p露脸普通话对白| 成人动漫视频在线观看免费| 不卡中文字幕av| 欧美一区二区精品| 日韩毛片在线免费观看| 国产一区二区导航在线播放| 99久久夜色精品国产亚洲狼 | 99精品福利视频| 97超碰成人| 日本在线视频www鲁啊鲁| www.aqdy爱情电影网| 在线视频91| 成人午夜电影在线播放| 午夜精品www| 日韩精品在线播放| 欧洲亚洲精品在线| 国产精品久久久久久亚洲毛片| 久久99热这里只有精品| 色爱综合网欧美| xvideos.蜜桃一区二区| 日韩精品av| 精品美女在线观看视频在线观看 | 亚洲精品在线电影| 日韩欧美在线视频观看| 日韩一区欧美小说| caoporn国产一区二区| 日本91福利区| 欧美激情电影| 色天下一区二区三区| 国产福利一区二区三区在线播放| 国产在线高潮| 美国一级片在线免费观看视频| 国产wwwxx| 精品中文字幕av| 欧洲精品在线播放| 欧美日韩在线免费观看视频| 狠狠躁夜夜躁人人躁婷婷91| 北条麻妃在线一区二区| 国产在线播放一区二区| 一区二区在线中文字幕电影视频| 一本色道久久亚洲综合精品蜜桃| 四虎亚洲精品| 黑人久久a级毛片免费观看| 波多野结衣91| 啪啪激情综合网| 秋霞一区二区三区| 国产精品.xx视频.xxtv| 欧洲av一区二区| av激情成人网| 欧美aaa级| 九九九九九九精品任你躁| 欧美成人黄色| 亚洲综合影院| 精品自拍偷拍| 红桃视频在线观看一区二区| 成人影院在线| 欧美日本在线| 日韩专区在线视频| 国产乱码精品一区二区三区av| 国产成人在线视频免费播放| 97久久精品人人爽人人爽蜜臀|