谈谈java中遍历Map的几种方法

java中的map遍历有多种方法,从最早的Iterator,到java5支持的foreach,再到java8 Lambda,让我们一起来看下具体的用法以及各自的优缺点

先初始化一个map

public class TestMap {public static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
}

keySet values

如果只需要map的key或者value,用map的keySet或values方法无疑是最方便的

  // KeySet 获取keypublic void testKeySet() {for (Integer key : map.keySet()) {System.out.println(key);}}// values 获取valuepublic void testValues() {for (Integer value : map.values()) {System.out.println(value);}}

keySet get(key)

如果需要同时获取key和value,可以先获取key,然后再通过map的get(key)获取value

需要说明的是,该方法不是最优选择,一般不推荐使用

  // keySet get(key) 获取key and valuepublic void testKeySetAndGetKey() {for (Integer key : map.keySet()) {System.out.println(key + ":" + map.get(key));}}

entrySet

通过对map entrySet的遍历,也可以同时拿到key和value,一般情况下,性能上要优于上一种,这一种也是最常用的遍历方法

  // entrySet 获取key and valuepublic void testEntry() {for (Map.Entry<Integer, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ":" + entry.getValue());}}

Iterator

对于上面的几种foreach都可以用Iterator代替,其实foreach在java5中才被支持,foreach的写法看起来更简洁

但Iterator也有其优势:在用foreach遍历map时,如果改变其大小,会报错,但如果只是删除元素,可以使用Iterator的remove方法删除元素

  // Iterator entrySet 获取key and valuepublic 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表达式支持,语法看起来更简洁,可以同时拿到key和value,不过,经测试,性能低于entrySet,所以更推荐用entrySet的方式

  // Lambda 获取key and valuepublic void testLambda() {map.forEach((key, value) -> {System.out.println(key + ":" + value);});}

简单性能测试

用10万条数据,做了一个简单性能测试,数据类型为Integer,map实现选取HashMap

  static {for (int i = 0; i < 100000; i++) {map.put(i, 1);}}

测试结果如下:

KeySet:           392
Values:           320
keySet get(key):  552
entrySet:         465
entrySet Iterator:508
Lambda:           536

需要说明的是,map存储的数据类型,map的大小,以及map的不同实现方式都会影响遍历的性能,所以该测试结果仅供参考

总结

如果只是获取key,或者value,推荐使用keySet或者values方式

如果同时需要key和value推荐使用entrySet

如果需要在遍历过程中删除元素推荐使用Iterator

如果需要在遍历过程中增加元素,可以新建一个临时map存放新增的元素,等遍历完毕,再把临时map放到原来的map中

转载于:https://www.cnblogs.com/zhaoguhong/p/7074597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416509.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自动打包_全自动打包机行业发展如何?全自动打包机行业发展现状分析

全自动打包机行业发展如何&#xff1f;全自动打包机行业发展现状分析随着经济的快速发展&#xff0c;现在很多产品的生产过程都变得简单起来&#xff0c;更新换代也非常快&#xff0c;这不仅促进了企业的发展&#xff0c;也提高了人们生活质量。全自动打包机作为企业生产中常见…

小可爱

转载于:https://www.cnblogs.com/lrf9606/p/7077434.html

13新功能_再聊聊灵感盒 -Marginnote 3.6.12/13新功能

我是夜雨&#xff0c;水群最多的一类人本文主要BB了我对灵感盒的理解Marginnote 3.6.12/13个人之前对灵感盒的理解在此强调开发者的一句话不要对灵感盒做太多高大上的引申灵感盒只不过是新的脑图结构关于灵感盒的延伸Zattelkasten/slip box/卡片盒笔记法该内容很早之前就在Marg…

Git之第三方托管oschina

一.git 简介 1.Git是一款免费、开源的分布式版本控制系统&#xff0c;用于敏捷高效地处理任何或小或大的项目。2.Git是一个开源的分布式版本控制系统&#xff0c;用以有效、高速的处理从很小到非常大的项目版本管理。3.Git 是由“Linux之父” Linus Torvalds 创建的。因为他发现…

局域网抢答器_基于童芯派的抢答器V1.0

[童心制物Makeblock]的新产品"童芯派"发布已两月有余&#xff0c;刚一发布就第一时间入手三个含扩展板的套装&#xff0c;Makeblock的产品我还是很认可的&#xff0c;从mbot&#xff0c;ranger到程小奔&#xff0c;从神经元&#xff0c;光环版到童芯派&#xff0c;东…

Spring-boot(一)

1.1 spring介绍 spring Boot使开发独立的&#xff0c;产品级别的基于Spring的应用变得非常简单&#xff0c;你只需"just run"。 我们为Spring平台及第三方库提供开箱即用的设置&#xff0c;这样你就可以有条不紊地开始。多数Spring Boot应用需要很少的Spring配置。 你…

下拉框_教你封装 Element Tree 树状下拉框

在日常项目开发中&#xff0c;树状下拉框的需求还是比较常见的&#xff0c;但是element并没有这种组件以供使用。在这里&#xff0c;小编就基于element如何封装一个树状下拉框做个详细的介绍。通过这篇文章&#xff0c;你可以了解学习到一个树状下拉框组件是如何一步一步封装成…

java异常处理,需要考虑的流程

异常处理&#xff0c;我们需要主意的事儿 问3个问题&#xff1a; 什么出了错&#xff1f;——异常类型 在哪出的错&#xff1f;——堆栈跟踪 为什么出错&#xff1f;——异常信息 把上面的3个问题回答好&#xff0c;在异常抛出后能快速对问题进行 定性、定位、定义。 要想让我们…

字体单独设置样式_Glyphs 官方教程 | 字体命名

​​字体名称是很重要的&#xff0c;它决定了字体菜单中的分组和顺序&#xff0c;而这直接影响你的字体将如何呈现给用户。在一款字体中&#xff0c;字体名称被存储在六个不同的地方&#xff0c;这一点已经相当困难&#xff1b;或者实际上还会有更多的地方&#xff0c;这就更复…

protractor端到端测试简介

安装依赖 protractornpm install -g protractor karma-jasminenpm install --save-dev karma-jasmine javaJDK http://blog.csdn.net/bingiser/article/details/53375282webdriver-managerwebdriver-manager update 文件 test.js 测试文件protractor_conf.js protractor配置文件…

arm linux 开机电路_ARM Linux启动过程分析

摘要&#xff1a;嵌入式Linux的可移植性使得我们可以在各种电子产品上看到它的身影。对于不同体系结构的处理器来说Linux的启动过程也有所不同。本文以S3C2410 ARM处理器为例&#xff0c;详细分析了系统上电后bootloader的执行流程及ARM Linux的启动过程。关键词&#xff1a;AR…

委外订单_ERP软件教程:金蝶ERP的委外加工业务流程(一)

ERP软件教程&#xff1a;金蝶ERP的委外加工业务流程关注我&#xff0c;我将定期分享更多的ERP解决方案转发关注并私信我&#xff0c;了解更多的解决方案及操作方法哦欢迎大家随时咨询关于金蝶ERP的任何问题&#xff01;一、应用软件版本&#xff1a;金蝶KIS旗舰版6.0二、应用场…