位置: IT常识 - 正文

Java 中九种 Map 的遍历方式,你一般用的是哪种呢?(java中map.entry)

编辑:rootadmin
日常工作中 Map 绝对是我们 Java 程序员高频使用的一种数据结构,那 Map 都有哪些遍历方式呢?这篇文章阿粉就带大家看一下,看看你经常使用的是哪一种。 通过 entrySet 来遍历 1、通过 for 和 map.entrySet() 来遍历 第一种方式是采用 for 和 Map.Entry ...

推荐整理分享Java 中九种 Map 的遍历方式,你一般用的是哪种呢?(java中map.entry),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:java 各种map,java中map种类,java map的常用方法,java.map,java map的常用方法,java中map的用法,java 几种map,java map的常用方法,内容如对您有帮助,希望把文章链接给更多的朋友!

日常工作中 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() 来遍历Java 中九种 Map 的遍历方式,你一般用的是哪种呢?(java中map.entry)

前面的遍历是通过 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() 的方法好。

本文链接地址:https://www.jiuchutong.com/zhishi/311670.html 转载请保留说明!

上一篇:React 高阶组件(react高阶组件)

下一篇:phpcms分页错误怎么解决(分页 php)

  • 华为nova5怎么看电量(华为nova5怎么看电池损耗)

    华为nova5怎么看电量(华为nova5怎么看电池损耗)

  • 抖音领域标签在哪查看(抖音标签功能是什么)

    抖音领域标签在哪查看(抖音标签功能是什么)

  • a4怎么横向打印4个大字(a4怎么横向打印4个大字居中)

    a4怎么横向打印4个大字(a4怎么横向打印4个大字居中)

  • 拼多多承诺48小时发货没有发(拼多多承诺48小时发货没有发怎么投诉)

    拼多多承诺48小时发货没有发(拼多多承诺48小时发货没有发怎么投诉)

  • 快手退货商家一直拒绝(快手退货商家一直说没收到货怎么办)

    快手退货商家一直拒绝(快手退货商家一直说没收到货怎么办)

  • ipad屏幕亮度调最亮还是很暗(ipad屏幕亮度调节)

    ipad屏幕亮度调最亮还是很暗(ipad屏幕亮度调节)

  • 什么是黑盒测试(什么是黑盒测试与白盒测试?他们适用于哪些测试?)

    什么是黑盒测试(什么是黑盒测试与白盒测试?他们适用于哪些测试?)

  • 淘宝店铺不存在或者已经关闭售后怎么办(淘宝店铺不存在或者店铺已关闭怎么办)

    淘宝店铺不存在或者已经关闭售后怎么办(淘宝店铺不存在或者店铺已关闭怎么办)

  • 为什么微信领不了红包账号异常(为什么微信领不了红包封面)

    为什么微信领不了红包账号异常(为什么微信领不了红包封面)

  • 苹果微信听筒模式怎么切换到扬声器(苹果微信 听筒)

    苹果微信听筒模式怎么切换到扬声器(苹果微信 听筒)

  • 承载系统要不要选lte

    承载系统要不要选lte

  • 入门级独显是什么意思(什么叫入门级独显)

    入门级独显是什么意思(什么叫入门级独显)

  • 苹果a1700怎么解锁(苹果a1700怎么解锁密码)

    苹果a1700怎么解锁(苹果a1700怎么解锁密码)

  • 华为锁屏密码忘了怎么办(华为锁屏密码忘了,但有指纹和人脸识别)

    华为锁屏密码忘了怎么办(华为锁屏密码忘了,但有指纹和人脸识别)

  • 地铁出站未扫码怎么算(地铁出站未扫码会不会有事)

    地铁出站未扫码怎么算(地铁出站未扫码会不会有事)

  • 华为数据线多长(华为数据线几米)

    华为数据线多长(华为数据线几米)

  • 乐视手机怎么设置锁屏(乐视手机怎么设置屏幕常亮)

    乐视手机怎么设置锁屏(乐视手机怎么设置屏幕常亮)

  • 手机怎么提取网页音乐(手机怎么提取网址链接)

    手机怎么提取网页音乐(手机怎么提取网址链接)

  • 淘宝上的自己的备注过内容在哪看(淘宝上的自己的店怎么开)

    淘宝上的自己的备注过内容在哪看(淘宝上的自己的店怎么开)

  • 怎么将图片转换成word文字(怎么将图片转换成word文档)

    怎么将图片转换成word文字(怎么将图片转换成word文档)

  • 千牛卖家中心在哪里(千牛卖家中心在哪里找到)

    千牛卖家中心在哪里(千牛卖家中心在哪里找到)

  • 在Win7中,防火墙怎么设置无法更改?(w7防火怎么开)

    在Win7中,防火墙怎么设置无法更改?(w7防火怎么开)

  • vue-print 实现打印功能(vue实现打印)

    vue-print 实现打印功能(vue实现打印)

  • 城市维护建设税优惠政策
  • 发生租赁费用怎么做账
  • 利润分配会计处理例题及解析
  • 未休年假补助
  • 电子承兑逾期提示付款说明怎么写
  • 注册资金印花税减半政策
  • 产权转移书据印花税分录
  • 土地使用税退税账务处理
  • 房地产企业净利润为负的原因
  • 个人取得哪项收入需要缴纳个人所得税
  • 现金日记账根据哪些凭证登记
  • 因质量问题怎么赔偿
  • 闲置资金怎么说?
  • 金融工具包括哪些及其法律特征
  • 出口退税附加税什么时候缴纳
  • 代发农民工工资承诺书
  • 房地产企业预收账款
  • 劳务派遣企业的规上企业认定标准
  • 19年入职19年离职
  • 免抵退税申报汇总表下载
  • 旅游业小规模纳税人亏损怎么填报
  • 工程公司收到工程款
  • 交易性金融资产入账价值怎么计算
  • 新版edge浏览器兼容ie
  • 无法访问您可能没有权限使用资源
  • 项目盈利后收到短信
  • 结转进项税销项税额的分录怎么写
  • 车辆购置税如何计算器
  • 怎么获得win10纯净版
  • 方正电脑u盘启动按什么键
  • 子公司接受母公司无偿划转的房屋如何缴纳房产税
  • php字符串型数据的定义方式
  • php的数组函数
  • uniapp vuecli
  • 子公司财务管理策略有哪些
  • PHP:imagecreatefromxpm()的用法_GD库图像处理函数
  • 多开票金额会计分录
  • 生产企业外销收入账务处理
  • 农产品抵扣进项税额的规定
  • 顺流交易的会计处理
  • 微信支付开发需要什么条件
  • 花生油代加工厂
  • 进项税大于销项税怎么结转
  • 福利部门的福利有哪些
  • 织梦模板改成帝国模板
  • 企业合并属于非企业吗
  • 积分兑换合适吗
  • 无票收入增值税怎么申报
  • 让渡资产使用权收入属于收入吗
  • 以前年度管理费用
  • 外购白酒继续生产白酒
  • 塔吊租赁和购买的区别
  • 印花税计入哪个会计分录
  • 过路费属于会计哪个科目
  • 减免所得税额a201030怎么填
  • 负库存金额
  • 建筑企业总公司施工可否由分公司开发票
  • 公司财务人员的作用
  • mac显示器颜色不一致
  • winton
  • 电脑xp桌面
  • win81蓝屏重启故障
  • win7系统自带网卡吗?
  • win10系统微软账户密码忘了
  • mobile windows
  • cocos creator特效制作
  • 画布canvas的基本步骤
  • linuxpasswd详解
  • javascript中有哪些数据类型
  • Android多线程开发
  • js模块化和组件化
  • unity官方插件
  • 异步promise原理
  • unity打包后的程序闪退
  • error: Error parsing XML: unbound prefix
  • 陕西省税务局电子税务局官网
  • 开个人发票有什么好处?
  • 手机陌陌卸载还有记录吗
  • 水资源税征收标准2023
  • 会计基础工作规范2024
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设