位置: IT常识 - 正文

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

发布时间:2024-01-27
日常工作中 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)

  • ios14怎么删除软件(ios14.0怎么删除软件)

    ios14怎么删除软件(ios14.0怎么删除软件)

  • qq的聊天记录怎么迁移到新手机上(qq的聊天记录怎么全部删除)

    qq的聊天记录怎么迁移到新手机上(qq的聊天记录怎么全部删除)

  • iphon7p防水吗(iphone 7 p防水吗)

    iphon7p防水吗(iphone 7 p防水吗)

  • 钉钉会议是语音还是视频(钉钉会议语音转文字功能)

    钉钉会议是语音还是视频(钉钉会议语音转文字功能)

  • 手机声音小了怎么修复(手机声音小了怎么恢复vivo)

    手机声音小了怎么修复(手机声音小了怎么恢复vivo)

  • 移动卡可以网上注销吗(移动卡可以网上实名认证吗)

    移动卡可以网上注销吗(移动卡可以网上实名认证吗)

  • 二寸照片尺寸像素宽高(二寸照片尺寸像素分辨率600)

    二寸照片尺寸像素宽高(二寸照片尺寸像素分辨率600)

  • 苹果7p支持无线充电吗(苹果7p支持无线冲吗)

    苹果7p支持无线充电吗(苹果7p支持无线冲吗)

  • 抖音修改昵称怎么一直修改不过来(抖音修改昵称怎么一直修改不过来?平果手机)

    抖音修改昵称怎么一直修改不过来(抖音修改昵称怎么一直修改不过来?平果手机)

  • 彩虹直播怎么看不了了(彩虹直播怎么看回放视频)

    彩虹直播怎么看不了了(彩虹直播怎么看回放视频)

  • 三星s10刷新率多少hz(三星s10 5g屏幕刷新率)

    三星s10刷新率多少hz(三星s10 5g屏幕刷新率)

  • 没加好友可以发文件吗(没加好友可以发红包吗)

    没加好友可以发文件吗(没加好友可以发红包吗)

  • 新版qq怎么复制群名片(qq怎么样复制)

    新版qq怎么复制群名片(qq怎么样复制)

  • ipad3网速很慢什么原因(ipad网速太差了)

    ipad3网速很慢什么原因(ipad网速太差了)

  • siri为什么不能打开旁白(siri为什么不能重启手机)

    siri为什么不能打开旁白(siri为什么不能重启手机)

  • htcu11怎么截图(htcu11手机)

    htcu11怎么截图(htcu11手机)

  • 趣键盘怎么发送消息(趣键盘的表情包怎样一键发送)

    趣键盘怎么发送消息(趣键盘的表情包怎样一键发送)

  • 手机测距离 怎么设置(手机测距离怎么用)

    手机测距离 怎么设置(手机测距离怎么用)

  • 微信加密码怎么设置(微信加密码怎么改密码)

    微信加密码怎么设置(微信加密码怎么改密码)

  • 苹果x变卡了怎么解决(苹果x有点卡了)

    苹果x变卡了怎么解决(苹果x有点卡了)

  • 淘宝人生有什么用(淘宝人生有什么奖励)

    淘宝人生有什么用(淘宝人生有什么奖励)

  • 怎么防止电脑弹出广告(怎么防止电脑弹出esc小广告)

    怎么防止电脑弹出广告(怎么防止电脑弹出esc小广告)

  • 荣耀20支持otg吗(荣耀20有ot g功能吗)

    荣耀20支持otg吗(荣耀20有ot g功能吗)

  • ip地址范围怎么算(ip地址范围怎么填写)

    ip地址范围怎么算(ip地址范围怎么填写)

  • Win11怎么设置桌面任务栏置顶?(win11怎么设置桌面显示我的电脑)

    Win11怎么设置桌面任务栏置顶?(win11怎么设置桌面显示我的电脑)

  • linux常用命令大全(linux 常用命令大全及其详解)

    linux常用命令大全(linux 常用命令大全及其详解)

  • 收到单位借款如何处理
  • 测绘费发票需要备注么
  • 政府专项补助资金需要交所得税吗
  • 临时设施摊销方案怎么写
  • 管家婆未开账可以录入单据吗
  • 银行存款支付现金股利属于什么科目
  • 未投入使用的道路
  • 营改增后甲供材的涉税风险
  • 销售费用现金支付
  • 现金支付用什么科目
  • 动漫产业增值税优惠政策
  • 置换新房产支付资金怎么纳税?
  • 收到采购材料发票的会计分录
  • 应交税金审计
  • 计提工资会计科目怎么写
  • 产品成本的计算公式
  • 实习生需要缴纳个税吗?
  • 怎么看发票是不是免税
  • 列举20种不征增值税产品
  • 股票价格变化的原因
  • 预付油卡怎么入账
  • 预提租赁费会计处理
  • 门店关闭费用怎么处理
  • 企业有哪些项目名称
  • 七彩虹主板 wol
  • 成本加成定价法包括()
  • 银行哪些进项税不用抵扣
  • 刚毕业的学生可以买学生票吗
  • 员工罚款算收入吗
  • 电脑装系统分区出现错误
  • 腾讯地图js api
  • 应付股利属于什么科目
  • 外资企业股权转让给外资企业
  • php制作数字验证码
  • 承兑汇票无法兑现的原因
  • 目前超频最高几ghz
  • 低值易耗品报废时有残料价值收回的应冲减当月成本费用
  • yew 框架
  • php 抽象类
  • 目标检测现状
  • 开发的php程序如何发布
  • 企业法人歇业后诉讼主体确认
  • token验证器
  • vuex的五个属性及使用方法 简书
  • 行政单位基建账如何并入大账
  • 表单验证用什么方法实现
  • ChatGPT全面升级,GPT4支持多模态数据。
  • php写一个简单的单例模式
  • 专项应付款二级明细科目有哪些
  • 软件开发企业如何计算利润
  • mongodb 教程
  • 营业成本包含折旧和摊销吗
  • 发放工资代扣个人所得税的记账凭证怎么填
  • 破产企业资产拍卖后,管理人仅办理产权登记未交付房屋
  • 购买银行理财产品安全吗
  • 水电费没有发票吗
  • 凭证必须用凭证盒
  • 工会经费计提比例是应发工资还是实发工资
  • 制造费用怎么写
  • 应付账款怎么处理
  • 直接私募如何纳税
  • 专项应付款的账务处理营业外收入
  • 现金流量比率是什么意思
  • 营业外支出会影响所有者权益吗
  • 企业要建账需留什么资料
  • 账簿设置方法
  • freebsd ifconfig
  • window10快捷键不能用
  • xp怎么改密码怎么设置
  • cs1.6 linux
  • cocos2dx性能优化与包体优化
  • shell 函数 return
  • css样式表三种方式
  • 虚拟机中使用keil
  • python清除运行结果
  • Node.js中的事件循环是什么
  • 自动登入
  • javascript的介绍
  • js中写html代码
  • 增值税按次纳税的规定
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号