遍历Map的六种方式

article/2025/9/10 12:37:20

遍历Map的六种方式

    • 一.创建Map
    • 二.遍历Map
        • 方式一:使用entrySet遍历(推荐使用)
        • 方式二:使用keySet遍历
        • 方式三:使用entrySet+Iterator遍历
        • 方式四:使用keySet+Iterator遍历
        • 方式五:使用keySet、values方法遍历
        • 方式六:使用JDK8提供的forEach方法遍历(推荐使用)
    • 三.总结
        • 1.测试六种遍历的效率
        • 2.禁用即时编译器,重新测试遍历的效率
        • 3.该如何选择HashMap的遍历方式

一.创建Map

遍历需要先创建一个测试类,这个测试类我们简单的写成如下

HashMap<String,String> map = new HashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");

二.遍历Map

方式一:使用entrySet遍历(推荐使用)

遍历方式如下:这里可以选择使用for循环、增强for循环、do-while循环、lamdba表达式等方式对EntrySet实现遍历,这些本质上都是遍历entrySet的不同方式而已,都属于同一种方式遍历,这里只展示使用lamdba的遍历方式。

Set<Map.Entry<String,String>> set = map.entrySet();
set.stream().forEach(entry ->{System.out.println(entry.getKey()+":"+entry.getValue());
});

方式二:使用keySet遍历

这里也可以选择使用for循环、增强for循环、do-while循环、lamdba表达式等方式对KeySet实现遍历,这些本质上都是遍历keySet的同一种方式遍历,这里只展示使用lamdba的遍历方式。

Set<String> set2 = map.keySet();
set2.stream().forEach(key ->{System.out.println(key+":"+map.get(key));
});

方式三:使用entrySet+Iterator遍历

这种方式需要使用entrySet方法加上迭代器,代码如下:

Iterator<Map.Entry<String,String>> iterable =  map.entrySet().iterator();
while(iterable.hasNext()){Map.Entry<String,String> entry = iterable.next();System.out.println(entry.getKey()+":"+entry.getValue());}

方式四:使用keySet+Iterator遍历

这种方式需要使用keySet方法加上迭代器,代码如下:

Iterator<String> set3 = map.keySet().iterator();
while(set3.hasNext()){String key = set3.next();System.out.println(key+":"+map.get(key));
}

方式五:使用keySet、values方法遍历

这种方式是key和value分别遍历的形式,应用场景不多,但也是一种方式,且效率不高,不推荐使用

Set<String> set4 = map.keySet();
set4.stream().forEach(key ->{System.out.println(key);
});
Collection<String> values = map.values();
values.stream().forEach(value ->{System.out.println(value);
});

方式六:使用JDK8提供的forEach方法遍历(推荐使用)

forEach方法是JDK8提供的方法,是为了我们方便使用lamdba。这个方法使用lamdba来实现,是非常简洁的。需要传入一个BiConsumer<K,U>,k和u其实就是键和值,我们只需要传入然后操作即可,代码如下:

map.forEach((key,value) ->{System.out.println(key+":"+value);
});

三.总结

六种方式我们不可能都用到,肯定还是需要选取效率最高的来使用,那哪种效率最高呢,来实际测试下。

1.测试六种遍历的效率

笔者往HashMap中插入了100万个数据,然后测试了这六种不同遍历方式所需要的时间如,且每个方式都经过了多次测试,得出数据如下(单位:毫秒):

//数组长度值的来源:1000000/0.75+1=1333334
HashMap<String,String> hashMap = new HashMap<>(1333334);方式一:3500-4000之间
方式二:3500-4000之间
方式三:3000-3600之间
方式四:3500-4000之间
方式五:6000-7000之间
方式六:3500-4000之间

可以发现除了key、value分别遍历的场景耗时比较严重,其他没有什么差别,显然这个结果是不对的,那是什么原因影响了正常结果呢,显然不可能是数据量不够,那么就只可能是即时编译器的锅了,我们知道即时编译器会对代码优化以及指令重排,这会影响到我们的正常程序逻辑。下面笔者禁用了即时编译器又重新测试了下。

2.禁用即时编译器,重新测试遍历的效率

首先我们禁用即时编译器,如下:
在这里插入图片描述
然后再一次测试各个遍历方式所消耗的时间,这里展示第一种遍历耗费时间的截图:
在这里插入图片描述
经过多次测试,六种遍历方式所耗时间如下:

方式一:稳定在8100左右
方式二:稳定在9900左右
方式三:稳定在8900左右
方式四:稳定在12000左右
方式五:稳定在12000左右
方式六:稳定在8300左右

上面所示就是六种遍历HashMap的效率了,可以清晰的看到哪个遍历效率才是最高的,排除微弱因素影响,我们使用方式一和方式六肯定是最好的选择。下面根据效率队各种遍历进行一个排序。

方式六(使用forEach方法)
等价于
方式一(使用entrySet方法)
优于
方式三(使用entrySet方法+Iterator迭代器)
优于
方式二(使用keySet方法)
优于
方式四(使用keySet方法+Iterator迭代器)
优于
方式五(使用keySet、values方法,分别遍历key、value)

3.该如何选择HashMap的遍历方式

根据上面的测试结果,可以很清晰的看到,我们在开发中应该首选forEach方法进行对HashMap进行遍历,使用entrySet方法也是可以的,但是不要使用keySet对Map进行遍历,所有涉及keySet的遍历方式效率均不高。阿里的开发手册中也是明令禁止使用keySet方法对HashMap进行遍历的。这里对HashMap的遍历总结就完了,希望这个总结也可以帮到路过的你。


http://chatgpt.dhexx.cn/article/WRqkJq5I.shtml

相关文章

Map.entry详解

Map.entrySet() 这个方法返回的是一个Set<Map.Entry<K,V>>,Map.Entry 是Map中的一个接口,他的用途是表示一个映射项(里面有Key和Value),而Set<Map.Entry<K,V>>表示一个映射项的Set。Map.Entry里有相应的getKey和getValue方法,即JavaBean,让我们…

遍历map的几种方法

#先往map加入几个数据 Map<Integer,String> mapnew HashMap<>();map.put(1,"美好的周一");map.put(2,"美好的周二");map.put(3,"美好的周三");方法一&#xff1a;普通的foreach循环&#xff0c;使用keySet()方法&#xff0c;遍历key…

The operator ‘SUBTRACT‘ is not supported between objects of type ‘null‘ and ‘java.lang.Integer‘

找了半天发现是判断id值是否为空时&#xff0c;数据类型发生转换问题。关于Integer和int在面试的时候出现的频率很高。而我们所熟知的是Integer是int 的包装类型&#xff0c;int的初始值为0&#xff0c;Integer的初始值为null。 org.springframework.expression.spel.SpelEvalu…

Spark Transformation —— subtract

上手使用 def subtract(other: RDD[T]): RDD[T] def subtract(other: RDD[T], numPartitions: Int): RDD[T] def subtract(other: RDD[T], partitioner: Partitioner)(implicit ord: Ordering[T] null): RDD[T] 该函数类似于intersection&#xff0c;但返回在RDD中出现&…

java 中subtract_Java.math.BigDecimal.subtract()方法实例

全屏 Java.math.BigDecimal.subtract()方法实例 java.math.BigDecimal.subtract(BigDecimal subtrahend)返回一个BigDecimal&#xff0c;其值为 (this - subtrahend), 精度为 max(this.scale(), subtrahend.scale()). 声明 以下是声明java.math.BigDecimal.subtract()方法publi…

bedtools subtract 基因区段取差集

基本概述&#xff1a; bedtools subtract 通俗的说&#xff0c;得到 A - B 的区段。如果在A中发现了B区段&#xff0c;就把 B 扣除&#xff0c;通过不同的参数&#xff0c;扣除的标准不一样。其中&#xff0c;参数 -A 可以达成 Remove features with any overlap 的效果&#x…

cv::subtract

计算两个数组或数组和标量之间的每个元素差。也就是图像的相减操作 opencv documentation的说明&#xff1a; 参数说明&#xff1a; src1:第一个输入数组或标量。 src2:第二个输入数组或标量。 src3:输出数组与输入数组有相同的大小和相同数量的通道。 src4:可选操作掩码;…

opencv之subtract

函数原型 void cv::subtract(InputArray src1, InputArray src2, OutputArray dst, InputArray masknoArray(), int dtype-1) python: dst cv.subtract(src1,src2[,dst[,mask[,dtype]]]) 参数说明 src1:input array or scalar src2:input array or scalar dst:output array…

OpenCV函数subtract()使用心得及需要注意的地方

OpenCV函数subtract()的原型如下&#xff1a; void cv::subtract( InputArray src1,InputArray src2,OutputArray dst,InputArray mask noArray(),int dtype -1 ) 官方文档说明如下&#xff1a; 看了以上文档并结合自己的使用&#xff0c;补充说明以下几点&#xff1a;…

moment系列一:add() 方法和subtract() 方法的使用

在工作中&#xff0c;因为自己去搜博客的时候老是找不到自己想要的答案&#xff0c;甚至一篇博客下来&#xff0c;找了好久都没收获&#xff0c;倍感疲惫&#xff0c;所以这里就废话不多说&#xff0c;直接上内容吧。 moment 中文官网地址&#xff1a;http://momentjs.cn momen…

基于改进EAST算法的文本检测

这段时间阅读研究了EAST算法以及在EAST算法上的改进并完成了复现运用到其他场景中去。 当今社会已进入图像大数据时代&#xff0c;图像数量庞大种类繁多&#xff0c;包含大量的有用知识。从图像中高效、精准、全面地提取文本和地理信息坐标等有用知识这一课题&#xff0c;也成…

自然文本检测主要模型

自然文本检测主要模型 CTPN模型 CTPN是目前流传最广、影响最大的开源文本检测模型&#xff0c;可以检测水平或微斜的文本行。文本行可以被看成一个字符sequence&#xff0c;而不是一般物体检测中单个独立的目标。同一文本行上各个字符图像间可以互为上下文&#xff0c;在训练…

深度学习:多场景多尺度的文本检测

《Fused Text Segmentation Networks for Multi-oriented Scene Text Detection》 用于多场景文本检测的融合文本分割网络。&#xff08;2018.5.7&#xff09; 文章笔记 摘要 - 本文从实例感知语义分割的角度介绍了一种新的面向多向场景文本检测的端到端框架。 我们提出了融…

FOTS:自然场景的文本检测与识别

在这篇文章里&#xff0c;我将分享我实现这篇论文的方法。 问题描述数据集关于数据使用的损失函数准备检测数据准备识别数据训练检测模型和识别模型代码整合显示结果引用 问题描述 我们需要从任何图像(包含文本)检测文本区域&#xff0c;这个图像可以是任何具有不同背景的东…

【文本检测】DBNet

目录 论文正文概述细节整体流程二值化自适应的门限可变形卷积标注损失计算推理 感悟 论文正文 链接&#xff1a;链接&#xff0c;提取码&#xff1a;7fmj 概述 文本检测主流的两个方法就是基于回归的方法和基于分割的方法。 基于回归的方法指的是迁移一些经典的目标检测算法…

openCV实践项目:图片文本检测

上一期我们通过对实验&#xff1a;银行卡卡号识别 加深了对前面所学openCV图像处理的一些理解 openCV实践项目&#xff1a;银行卡卡号识别_老师我作业忘带了的博客-CSDN博客 本次图片文本检测相对于要容易一些&#xff0c;内容如下&#xff1a; 一、流程说明 把一个这样的图片…

TextSnake文本检测

论文《TextSnake: A Flexible Representation for Detecting Text of Arbitrary Shapes》 (1) 数据集 文章中提到了4个数据集&#xff1a; 1) Total-Text&#xff1b;(新开源曲线文本数据集) 2) SCUT-CTW1500; (新开源曲线文本数据集) 3) ICDAR 2015;(经典数据集) 4) MSRA…

值得一看的文本检测方法

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 前 言 目前深度学习方法做文本检测比较普遍&#xff0c;但是也存在一些时候GPU资源不够&#xff0c;这时候就需要一些其他的方法来检测文本信息&#xff0c;本文主要介…

文本检测与识别

基于Advanced_EAST的文本检测算法 Advanced_EAST算法使用全卷积网络结构&#xff0c;输入图像通过全卷积神经网络后直接获得候选文本的位置&#xff0c;再通过非极大值抑制算法&#xff08;Non-Maximum Suppression&#xff0c;NMS&#xff09;获得最后的文本检测结果。 网络…