位置: 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)

  • 趣头条怎么提现(趣头条怎么提现不出来钱在什么地方)

    趣头条怎么提现(趣头条怎么提现不出来钱在什么地方)

  • 手机2k分辨率是多少(手机2k分辨率是多少像素)

    手机2k分辨率是多少(手机2k分辨率是多少像素)

  • cad注册机被当成window10当做病毒(cad注册机被认为是病毒怎么办)

    cad注册机被当成window10当做病毒(cad注册机被认为是病毒怎么办)

  • 嘀嗒拼车1+1拼车规则(嘀嗒拼车1+1拼车后先去接谁)

    嘀嗒拼车1+1拼车规则(嘀嗒拼车1+1拼车后先去接谁)

  • 手机在口袋里老是误触到怎么办(手机在口袋里老是亮屏)

    手机在口袋里老是误触到怎么办(手机在口袋里老是亮屏)

  • 硬盘分区之后能还原吗(硬盘分区后还能恢复数据吗)

    硬盘分区之后能还原吗(硬盘分区后还能恢复数据吗)

  • sim卡怎么放才正确(sim卡怎么放才正确图片oppo)

    sim卡怎么放才正确(sim卡怎么放才正确图片oppo)

  • 美团评价评错了怎么办(美团评价评错了怎么撤回)

    美团评价评错了怎么办(美团评价评错了怎么撤回)

  • 怎么注册新的微信号(怎么注册新的微博号)

    怎么注册新的微信号(怎么注册新的微博号)

  • 网速下降1mbps是什么(网速下降到1m)

    网速下降1mbps是什么(网速下降到1m)

  • iaf认证什么内容(iaf认证是什么认证)

    iaf认证什么内容(iaf认证是什么认证)

  • 为什么微信头像模糊(为什么微信头像变成空白人头)

    为什么微信头像模糊(为什么微信头像变成空白人头)

  • 华为荣耀9x上市时间(华为荣耀30)

    华为荣耀9x上市时间(华为荣耀30)

  • 手机上的小孔有什么用处(手机上的小孔有什么用顶部)

    手机上的小孔有什么用处(手机上的小孔有什么用顶部)

  • 快手粉丝删了怎么恢复(快手粉丝删了能恢复吗)

    快手粉丝删了怎么恢复(快手粉丝删了能恢复吗)

  • 5g要换手机号码吗(5g要换手机号码怎么办)

    5g要换手机号码吗(5g要换手机号码怎么办)

  • 时控开关怎么调时间(时控开关怎么调每天定时开关)

    时控开关怎么调时间(时控开关怎么调每天定时开关)

  • 海康威视检测不到硬盘(海康威视一直检测中怎么办)

    海康威视检测不到硬盘(海康威视一直检测中怎么办)

  • 转转保证金怎么退(转转保证金怎么申请退回来)

    转转保证金怎么退(转转保证金怎么申请退回来)

  • 7p32g够用吗(7p32g内存够用吗)

    7p32g够用吗(7p32g内存够用吗)

  • 手机照片可以复印吗(手机照片可以复印到纸上吗)

    手机照片可以复印吗(手机照片可以复印到纸上吗)

  • 华为p20如何升级9.1(华为p20如何升级鸿蒙3.0系统)

    华为p20如何升级9.1(华为p20如何升级鸿蒙3.0系统)

  • 怎么查路由器有多少人在用(怎么查路由器有哪些设备在使用)

    怎么查路由器有多少人在用(怎么查路由器有哪些设备在使用)

  • 支付宝怎么改实名认证(支付宝怎么改实名认证?苹果)

    支付宝怎么改实名认证(支付宝怎么改实名认证?苹果)

  • 钉钉里特别关注在哪里设置(钉钉里特别关注某人,他会知道吗)

    钉钉里特别关注在哪里设置(钉钉里特别关注某人,他会知道吗)

  • iphone无线耳机接电话(iphone 无线耳机 链接)

    iphone无线耳机接电话(iphone 无线耳机 链接)

  • 手机接口分类(usb接口分类)

    手机接口分类(usb接口分类)

  • 苹果电脑字体文件夹位置(苹果电脑字体文件怎么拖出来)

    苹果电脑字体文件夹位置(苹果电脑字体文件怎么拖出来)

  • 销售额是含税价还是不含税价
  • 中国进口货物完税价格表
  • 专票要写开户行和账号
  • 个税负数怎么做账
  • 物业公司停车费按什么征税
  • 特殊性税务处理所得税怎么算
  • 2021成品油增值税计算
  • 发票上的收款人负法律责任吗
  • 进项抵扣的金额怎么算
  • 税务局开专票作废重开及退税流程
  • 专用存款账户需要备案吗
  • 销售企业资金风险点有哪些呢
  • 哪些纳税人可以申请存量留抵退税
  • 购买车位需要交哪些税
  • 一般纳税人收到专票怎么做分录
  • 行业协会的作用定位
  • 个体户查账征收怎么交税?
  • 宣传资料设计制作
  • 事业单位事业收入和经营收入要上缴财政
  • 单独出售的包装物是否属于包装物的核算范围
  • 企业研发活动中心职责
  • 终于找到修改mac的方法了!
  • 管理员已阻止你运行此应用 win10
  • 建筑业销项税和进项税计算
  • 工程结算如何进行
  • c盘扩展卷是灰色的,有空间
  • php文件可包含哪三部分代码
  • 若依框架自动生成代码
  • PHP:Memcached::prepend()的用法_Memcached类
  • 银行汇票和银行本票区别图解
  • 原始凭证填的基数怎么填
  • php设计模型
  • uni app怎么样
  • 企业固定资产计提折旧是以什么为前提
  • 购买股票会计分录怎么写
  • 三级菜单python
  • 国有土地租赁合同规定多少年
  • 企业一次性取得所得税
  • 兼职老师工资怎么扣税
  • 开票收款人在哪里设置
  • 开源原则
  • 2022年微信小程序游戏
  • python魔法方法详解
  • 新建利润表
  • 床垫可以开专票抵扣吗
  • 收到合同预付款怎么处理
  • scrapy csdn
  • dedecms仿站如何做
  • 用vue做的企业项目
  • 日用品开增值税专用发票可以抵扣吗
  • 企业所得税季报人数季度初值
  • sql server数据查询语句
  • 失控发票已补交什么意思
  • 业务招待费纳税筹划
  • 在建工程账务处理问题有哪些
  • 外汇汇率调整分为哪几种
  • 运输费增值税专用发票
  • mysql8.0优化
  • sql server如何修改表名
  • windows桌面快捷方式怎么创建
  • window10桌面有白色框
  • 安装fedora33
  • ctrl+的作用
  • linux nyy
  • centos6.5怎么进入图形界面
  • 桌面预览怎么设置
  • 网页收集数据
  • js按下键盘事件
  • linux压缩命令compress
  • unity多人联机服务器客户端
  • input checked选择
  • 正则化实现
  • 面向对象的三大特征
  • 税务文书送达地点
  • 国家税务江苏税务总局官网
  • 江苏省国家税务局
  • 税务处理决定书属于行政处罚吗
  • 辽宁税务微信公众号
  • 河南省税务总局网站官网
  • 区地税局会不会分到乡镇
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设