怎么遍历map,map的几种遍历方式

日常工作中Map绝对是我们Java程序员高频使用的一种数据结构,那Map都有哪些遍历方式呢?这篇文章阿粉就带大家看一下,看看你经常使用的是哪一种。通过entrySet来遍历利用iterator和Map

日常工作中 Map 绝对是我们 Java 程序员高频使用的一种数据结构,那 Map 都有哪些遍历方式呢?这篇文章阿粉就带大家看一下,看看你经常使用的是哪一种。

通过entrySet来遍历

利用 iterator 和 Map.Entry 【方法1】稳居第一,领先 第二名差不多7s。第二名为 Eclipse (CS) collections 中的 MutableMap 位列第二,在大数据量下表现表现比较出色。指的注意的是之前在小数据量下表现。

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()的迭代器来遍历,代码如下。

3、通过while,Iterator和map.entrySet()来遍历

上面的迭代器是使用 for 来遍历,那我们自然可以想到还可以用 while 来进行遍历,所以代码如下所示。

这种方法跟上面的方法类似,只不过循环从 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)来获取。

1、这是最常见的并且在大多数情况下也是最可取的遍历方式,在键值都需要时使用。Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (Map.Entry<Integer, Integer> entry : map.entrySet()) { System。.

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()来遍历

怎么遍历map

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() 的操作。

第1种方法:通过map.entrySet()循环获取数据 第2种方法:通过map.keySet()循环获取数据 第3种方法:通过map.values()循环获取数据,但是无法获取key值 第4种方法:通过iterator循环获取数据,优点在于可以添加或删除数据 map。.

Java 8 的遍历方式

ava中map的常用遍历的具体方法有:一 、在for-each循环中使用entries来遍历。这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。二、 在for-each循环中遍历keys或values。如果只需要map中的键或者值。

注意下面的几个遍历方法都是是 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遍历

第一个可以称为关键字(key),每个关键字只能在map中出现一次;第二个可能称为该关键字的值(value);我们了解到map之后就可以操作他了 include<iostream> include<map> using namespace std;int main(){    。

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(&34;);long totalTime = 0;for (int size = outSize; size > 0; size--) {long startTime = System.currentTimeMillis();testMap1(map);totalTime += System.currentTimeMillis() - startTime;}System.out.println(&34; + (totalTime / outSize));// 省略其他方法,代码跟上面一致}

为了避免一些干扰,这里通过外层的 for 来进行多次计算,然后求平均值,当我们的参数分别是 outSize = 1,mapSize = 200 的时候,测试的结果如下

当随着我们增大 mapSize 的时候,我们会发现,后面几个方法的性能是逐渐上升的。

总结

从上面的例子来看,当我们的集合数量很少的时候,基本上普通的遍历就可以搞定,不需要使用 JDK 8 的高级 API 来进行遍历,当我们的集合数量较大的时候,就可以考虑采用 JDK 8 的 forEach 或者 Stream 来进行遍历,这样的话效率更高。在普通的遍历方法中 entrySet() 的方法要比使用 keySet() 的方法好。

上一篇 2023年02月03 15:34
下一篇 2023年02月08 05:00

相关推荐

  • 怎样去鼓励孩子,怎么鼓励孩子进步和自信

    《中餐厅》第三季,有个小女孩掉了勺子,想让妈妈去帮忙向服务员杨紫要,小女孩不敢,非让妈妈要。妈妈坚持并鼓励孩子自己去沟通。最好的方法之一就是利用他们天生的求知欲和学习能力。激励孩子学习的态度之一就是积

    2022年12月29 262
  • word标注怎么去掉,如何把word旁边的注释删掉

    Word文档默认情况是有回车符的,如何把word旁边的注释删掉,如果有一天你看到同事或其他人的文档没有回车符号,是不是有些难以置信,他是怎么做到的?这些回车符号的含义是什么?如何删除它们?回车符号我们

    2023年01月21 246
  • 怎么学cad制图,学cad平面设计

    CAD制图必学入门教程1.【CTrl+N无效时之解决办法】CTRL+N:新建命令有时CTRL+N则出现选择面板"v4Q7X5P9D"c操作:OP(选项)------系统-------右侧有一个启动(A

    2023年02月02 268
  • 怎样写诉讼状,自己写起诉书怎么写

    起诉状是当事人向法院递交的第一份纸质材料,其重要性不言而喻,自己写起诉书怎么写,但是在起诉状的书写中有很多误区。很多人认为在起诉状中应该尽量多地展示己方的观点,错误地以为事实和法条写得越详细越好,殊不

    2022年12月27 212
  • 怎么计算平方,平方计算口诀

    当然,公众的安全感同等重要。正如一些媒体评论所言,“买房人之所以觉得自己花了冤枉钱,是因为为莫名其妙的面积买了单,等于你买支铅笔只拿了个铅芯,买棵青菜只拿到个菜心,买件皮袄只拿到了马甲”“稀里糊涂、晕

    2023年02月09 241
  • ps怎么替换图片,ps换图片换成另一个图片

    关注职场办公,分享实用干货,洞察科技资讯,这里是「职场科技范」。大家平时出去游玩拍照,有没有遇到过这种情况,ps换图片换成另一个图片,因为天空不作美,而拍不出好看的照片。其实不用担心,今天就来教你用P

    2023年01月20 244
  • 生活感言,人生感悟作文450字

    1.要知道伟大的爱和伟大的成就都含有极大的风险。人生感悟作文450字,Takeintoaccountthatgreatloveandgreatachievementsinvolvegreatrisk.

    2022年12月10 226
  • 怎样画书包,7一12岁手工小书包

    教学目的1、了解书包的相关知识,并学习书包层次的表现与塑造。2、通过观察图片,了解书包的基本结构。3、学习通过小手工的制作,表现书包的立体质感。笔、纸。1、先画书包背面下方的装饰,如下图所示。2、再画

    2022年12月29 233
  • 怎样的泥土,什么的泥土二年级

    老家的水甘甜轻柔,一如家乡的空气。屈原说“沧浪之水清兮,可以濯我缨;沧浪之水浊兮,可以濯我足”,故乡的一切无不有着个人的主观情感,偏生偏爱。而老家的的泥土呢,你又是怎样了解的呢?我在黄土地里有过很长一

    2022年12月27 294
  • 怎么查论文,论文文献查询

    毕业季到来时,毕业生们将开始写论文。从写作到发表的过程非常严谨,尤其是论文查重的时候。大部分高校都会选择万方查重论文系统。今天paperfree小编就来给大家介绍一下如何查重个人论文的。我们信任pap

    2023年02月09 265
  • a1驾照怎么考,A1驾照有多难考

    在新交规中C1是不能直接增驾A1,因为A1是载客汽车类型中最高级别的驾驶证,若要想增驾A1,那么首先要先增驾到A3、B1或者B2,然后再从这些驾照增驾到A1。不过也是有例外,在《机动车驾驶证申领和使用

    2023年01月22 220
  • 怎样查入团时间,团员自我评议个人总结500字

    其二,从法国回国后以共产党员身份兼任团员。在建党初期所有共产党员都兼任团员,党的领导人兼任团组织负责人,无须办理入团手续。蔡和森回国后不久参加社会主义青年团临时中央局工作,1922年4月参与筹备社会主

    2022年12月31 259
  • 怎样做螃蟹视频教程

    避风塘螃蟹属于粤菜系,是香港十大经典名菜之一,螃蟹怎做的视频教程,它的精髓在于那独特的蒜蓉,它甘口焦香,脆而不糊。“避风塘”指的是铜锣湾避风塘,它历史悠久,也颇有情调,因此以它而命名之。避风塘螃蟹食材

    2023年01月06 286
关注微信