阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

这篇具有很好参考价值的文章主要介绍了阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

​今天不举例子了,问一句你开心吗?不开心也要记得把开心的事情放到快乐源泉小瓶子里,偶尔拿出来一一遍历看看。

Map在我们Java程序员高频使用的一种数据结构,Map的遍历方式也有很多种,那那种方式比较高效呢,今天就带大家一起验证下。

先说一下阿里巴巴Java开发手册的建议:

【推荐】使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历。 

说明:keySet其实遍历了2次,一次是转换为Iterator对象,另一次是从hashMap种取出key对应的value。如果是JDK8,使用Map.forEash方法。

1:通过for和map.entrySet()方式遍历。

// Map初始化
 private  static Map<String,Integer> initMap(int count){
        AlternativeJdkIdGenerator alternativeJdkIdGenerator = new AlternativeJdkIdGenerator();
        Map<String,Integer> map = new HashMap<>();
        for (int i = 0; i < count; i++) {
            map.put(alternativeJdkIdGenerator.generateId().toString(),i) ;
        }
        return  map ;
    }
int count = 1000000;
        Map<String,Integer> map =initMap(count) ;
        // 为了计算平均值,分别循环三次进行遍历
        for (int i = 0; i < 3; i++) {
            Instant start;
            Instant end;
            start = Instant.now();
            for (Map.Entry<String, Integer> entry : map.entrySet()) {
                // 一般遍历map就是获取key和value
                String  result="key为:"+entry.getKey()+",value为:"+entry.getValue();
            }
            end = Instant.now();
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }

运行三次的结果如下:(平均值:368.33ms)

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

​2、通过 for, Iterator 和 map.entrySet() 来遍历

  int count = 1000000;
        Map<String,Integer> map =initMap(count) ;
        for (int i = 0; i < 3; i++) {
            Instant start;
            Instant end;
            start = Instant.now();
            for (Iterator<Map.Entry<String,Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
                Map.Entry<String,Integer> entry = entries.next();
                String result ="key为:"+entry.getKey()+",value为:"+entry.getValue();
            }
            end = Instant.now();
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }

​运行三次的结果如下:(平均值:339.66ms)

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

 

 ​3、通过 for 和 map.keySet() 来遍历

 int count = 1000000;
        Map<String,Integer> map =initMap(count) ;
        for (int i = 0; i < 3; i++) {
            Instant start;
            Instant end;
            start = Instant.now();
            for (String key : map.keySet()) {
                String result ="key为:"+key+",value为:"+map.get(key);
            }
            end = Instant.now();
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }

运行三次的结果如下:(平均值:379.66ms)

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

​4、通过 for,Iterator 和 map.keySet() 来遍历

  int count = 1000000;
        Map<String,Integer> map =initMap(count) ;
        for (int i = 0; i < 3; i++) {
            Instant start;
            Instant end;
            start = Instant.now();
            for (Iterator<String> key = map.keySet().iterator(); key.hasNext(); ) {
                String k = key.next();
                String result ="key为:"+k+",value为:"+map.get(k);
            }
            end = Instant.now();
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }

运行三次的结果如下:(平均值330.33ms)

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

 5、通过 map.forEach() 来遍历

int count = 1000000;
        Map<String,Integer> map =initMap(count) ;
        for (int i = 0; i < 3; i++) {
            Instant start;
            Instant end;
            start = Instant.now();
            map.forEach((key, value) -> {
                String result ="key为:"+key+",value为:"+map.get(value);
            });
            end = Instant.now();
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end).toMillis() + "ms");
        }

​运行三次的结果如下:(平均值506.33ms)

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

 

​经过上面的验证(在大批量数据的时候,数据量小的时候没测试,感觉数据量小的化耗时太小更不好比较)最好不要用map.forEach()来遍历Map。在普通的遍历方法中 entrySet() 的方法要比使用 keySet() 的方法好。【PS虽然keySet() 的平均值有时候比较小,但它的波动性比较大,所以还是考虑阿里巴巴Java开发手册的建议使用entrySet()遍历Map】。

看过 HashMap 源码的同学应该会发现,这个遍历方式【entrySet(】在源码中也有使用,如下图所示。

 阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

 ​Spring的源码也有很多的Map,大神们遍历的方式也都基本使用entrySet()遍历如下:

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

 

 所以开发中也建议使用entrySet()来遍历Map。文章来源地址https://www.toymoban.com/news/detail-408806.html

到了这里,关于阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 阿里巴巴数字化转型的启示

    阿里巴巴(简称阿里)作为数字化转型的倡导者和先驱者, 率先成功实现了数字化转型。其成功转型带来的利好鼓舞了更多企业积极投身数字化,尤其是淘宝的数字化转型过程为其他企业提供了很多值得借鉴的经验,本文将对这些内容加以阐述。 01 淘宝的数据使用和数字化

    2024年02月04日
    浏览(47)
  • OpenVPN服务器,面试阿里巴巴

    四、OpenVPN****实验案例 说明: 实验需要三台设备,由于OpenVPN的服务端程序和客户端程序需要到网上下载,因此在此实验中VPN服务器和远程客户端需要具有上网功能。将虚拟交换机vmnet8改为nat模式,并设置网关为172.16.0.2。 VPN服务器: ens33连接企业内网vmnet1上 ip地址:192.168.

    2024年04月25日
    浏览(49)
  • 【Java】阿里巴巴Java开发手册

    提示:仅供学习参考使用 阿里巴巴Java开发手册,在Java开发中尽可能的遵循开发规则,会对编码有很大的帮助哦~ 本文章内容为阿里巴巴集团技术部的技术分享,版权归阿里巴巴集团所有,仅供大家交流、学习及研究使用,禁止用于商业用途,违者必究! 【强制】 代码中的命

    2024年02月11日
    浏览(91)
  • uniapp引入阿里巴巴矢量图标库

    首先:打开阿里巴巴矢量图标库 iconfont-阿里巴巴矢量图标库   2.注册账号并进行登录操作,如果已经有账号了直接进行登录操作 3.选择需要的图标,点击添加入库 4.点击购物车图标,查看添加入库的图标    输入项目名称,然后点击确认即可 5.点击生成代码  6.点击下载到本

    2024年01月17日
    浏览(47)
  • uniapp离线引入阿里巴巴图标

    阿里巴巴图标地址

    2024年02月16日
    浏览(45)
  • 钉钉小程序引用阿里巴巴图标

    2.打开的界面如图,先建一个iconfont.acss文件,全选浏览器打开的样式代码,复制粘贴进新建的iconfont.acss文件中 3.使用

    2024年02月11日
    浏览(45)
  • 华为OD机考--阿里巴巴黄金箱

    贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子每个箱子上面贴有一个数字箱子中可能有一个黄金宝箱。 黄金宝箱满足排在它之前的所有箱子数字和等于排在它之后的所有箱子数字之和; 一个箱子左边部分的数字和定义为

    2024年02月14日
    浏览(51)
  • 阿里巴巴达摩院通义千问【附申请链接】阿里版ChatGPT

    阿里云作为数一数二的全球云平台,阿里的大语言模型通义千问还是值得期待的,凭借强大的算力支持还是有机会赶上人工智能发展浪潮。 早前阿里巴巴达摩院关于人工智能机器人的研讨信息引起不少关注,当时达摩院也对比测试百度的文心一言。现在阿里巴巴自己的人工智

    2023年04月18日
    浏览(40)
  • 【阿里云镜像】更改阿里巴巴开源镜像站镜像源之——CentOS 7

    为了下载速度快,每次都要做好镜像的更改,既然次数多,懒得每次还来查资料,就自己写一篇博客加强自己的记忆。 阿里巴巴 OPSX 开源镜像站,提供 CentOS、Debian、Ubuntu、 Fedora、Arch Linux、Gentoo、openSUSE、Scientific Linux 等主流发行版的软件源镜像。为阿里云和互联网用户提供

    2024年02月05日
    浏览(55)
  • 阿里巴巴_java开发规范手册详解

    反例: _name, $name, __name 说明:正确的英文拼写和语法可以让阅读者易于理解,避免歧义。注意,纯拼音命名方式更要避免采用。 正例:renminbi / alibaba / taobao / youku / hangzhou 等国际通用的名称,可视同英文。 反例:DaZhePromotion [打折] / getPingfenByName() [评分] / int 某变量 = 3 正例:

    2024年02月06日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包