Java HashMap遍历方式性能探讨「建议收藏」

Java HashMap遍历方式性能探讨

大家好,又见面了,我是全栈君。

关于HashMap的实现这里就不展开了,具体可以参考JDK7与JDK8中HashMap的实现

JDK8之前,可以使用keySet或者entrySet来遍历HashMap,JDK8中引入了map.foreach来进行遍历。

原因:

keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。 

1. keySet和entrySet

1.1 基本用法

keySet:

Map map=new HashMap();
Iterator it=map.keySet().iterator();
Object key;
Object value;
while(it.hasNext()){
key=it.next();
value=map.get(key);
System.out.println(key+":"+value);
}

entrySet:

Map map=new HashMap();
Iterator it=map.entrySet().iterator();
Object key;
Object value;
while(it.hasNext()){
Map.Entry entry = (Map.Entry)it.next();
key=entry.getKey();
value=entry.getValue();
System.out.println(key+"="+value);
}

源码上看:

keySet:

final class KeyIterator extends HashIterator
        implements Iterator<K> {
        public final K next() { return nextNode().key; }
    }

entrySet:

final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

其实这里已经很明显了,当要得到某个value时,keySet还需要从HashMap中get,entrySet相比keySet少了遍历table的过程,这也是两者性能上的主要差别。

2. Map.foreach

在JDK8以后,引入了Map.foreach。

Map.foreach本质仍然是entrySet

default void forEach(BiConsumer<? super K, ? super V> action) {
        Objects.requireNonNull(action);
        for (Map.Entry<K, V> entry : entrySet()) {
            K k;
            V v;
            try {
                k = entry.getKey();
                v = entry.getValue();
            } catch(IllegalStateException ise) {
                // this usually means the entry is no longer in the map.
                throw new ConcurrentModificationException(ise);
            }
            action.accept(k, v);
        }
    }

配合lambda表达式一起使用,操作起来更加方便。

2.1 使用Java8的foreach+lambda表达式遍历Map

Map<String, Integer> items = new HashMap<>();
items.put("A", 10);
items.put("B", 20);
items.put("C", 30);
items.put("D", 40);
items.put("E", 50);
items.put("F", 60);

items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));

items.forEach((k,v)->{
    System.out.println("Item : " + k + " Count : " + v);
    if("E".equals(k)){
        System.out.println("Hello E");
    }
});

 

Reference:

1. http://lizhuang.iteye.com/blog/2356044

2. http://blog.163.com/fw_long/blog/static/51771186201392982041337/

3. https://yq.aliyun.com/articles/44712

转载于:https://my.oschina.net/hosee/blog/1488876

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/108301.html原文链接:https://javaforall.net

(0)
上一篇 2022年3月5日 下午3:00
下一篇 2022年3月5日 下午4:00


相关推荐

  • dategrip激活码【2021最新】

    (dategrip激活码)JetBrains旗下有多款编译器工具(如:IntelliJ、WebStorm、PyCharm等)在各编程领域几乎都占据了垄断地位。建立在开源IntelliJ平台之上,过去15年以来,JetBrains一直在不断发展和完善这个平台。这个平台可以针对您的开发工作流进行微调并且能够提供…

    2022年3月22日
    58
  • Linux查看文件夹大小

    Linux查看文件夹大小Linux 查看文件夹大小 1Linux 下查看文件和文件夹大小 1 1df 命令 1 2du 命令 1Linux 下查看文件和文件夹大小当磁盘大小超过标准时会有报警提示 这时如果掌握 df 和 du 命令是非常明智的选择 df 可以查看一级文件夹大小 使用比例 档案系统及其挂入点 但对文件却无能为力 du 可以查看文件及文件夹的大小 两者配合使用 非常有效 比如用 df 查看哪个一级目录过大 然后用 df 查看文件夹或文件的大小 如此便可迅速确定症结 下面分别简要介绍 1 1df 命令 可以用来查看分区的文

    2026年3月16日
    2
  • strsep使用纪要

    strsep使用纪要创建于 2012 05 29 迁移自个人的百度空间 include nbsp lt string h gt 原型 char nbsp strsep char nbsp stringp nbsp const nbsp char nbsp delim 功能 分解字符串为一组字符串 和 strtok 类似 stringp nbsp 为 nbsp NULL nbsp 字符串 则函式会回传 nbsp NUL

    2026年3月19日
    2
  • mybatiscodehelperpro 2.9.6激活码【2021最新】「建议收藏」

    (mybatiscodehelperpro 2.9.6激活码)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~1PA3AFINM4-eyJsaWNlb…

    2022年3月31日
    1.0K
  • Jquery Ajax 跨域调用asmx类型 WebService范例

    Jquery Ajax 跨域调用asmx类型 WebService范例Ajax在Web2.0时代起着非常重要的作用,然而有时因为同源策略(SOP)(俗称:跨域问题(crossdomain))它的作用会受到限制。在本文中,将学习如何克服合作限制。本文以asmx方式搭建webservice作为测试用后端,给出完整的前后端调用解决方案、范例代码。

    2022年6月3日
    43
  • windows-2016搭建AD域服务器教程

    windows-2016搭建AD域服务器教程1 AD 域 AD 是 ActiveDirect 的缩写 即活动目录 DomainContro 是一台计算机 实现用户 计算机 目录的统一管理 AD 活动目录 是一种存储协议 基于 LDAP 2 域控制器 DCDC 是 DomainContro 的缩写 即域控制器 域控制器是通过活动目录 AD 提供服务 一个域内可以有多台的域控制器 而在大部分情况下 每一台域控制器的地位是平等的 它们各存储着一份相同的活动目录 1 在服务器管理器里面添加角色与功能 2 勾选 AD 域服务功能 3 安装完成后

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号