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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • qq群泄露数据库_QQ群聊天记录全部人都可以看到吗

    qq群泄露数据库_QQ群聊天记录全部人都可以看到吗目录:基本介绍漏洞截图迅雷下载截图百度云下载截图       这年头,用户资料都可以论斤卖了,无论是快递单上的用户信息,还是酒店的开房记录,还是网站的登陆密码,只要黑客想要,都能手到擒来。这不,根据乌云的报告,18号下午QQ群的用户资料被大量泄漏了!据乌云平台上漏洞提交者“路人甲@乌云”称,该漏洞可能是腾讯早期的漏洞被利用抓取,相关数据可以

    2022年9月27日
    5
  • RGBD相机总结_光圈快门iso

    RGBD相机总结_光圈快门iso对深度相机进行总结,方便不断补充。

    2025年12月9日
    3
  • Java集合篇:Map总结

    Java集合篇:Map总结

    2021年10月4日
    35
  • 括号匹配问题 栈c语言(c语言栈实现括号匹配)

    例如:{}[()]、{[()]}、()[]{}这种大中小括号成对出现(位置不限)则为括号匹配,反之则不匹配,如{()[接下来看一下实现方式栈的定义以及相关操作//栈的定义typedefstruct{ charelem[stack_size]; inttop;}seqStack;//栈的初始化voidinitStack(seqStack*s){ s->top=-…

    2022年4月13日
    57
  • 手机写java_手机怎么写java

    手机写java_手机怎么写java手机怎么写java通常我们写java程序都是在电脑上,很少在手机上写程序,因为手机屏幕小,写起来不方便,而且ide也没有电脑的好用。但手机相对来说比较便捷,随时随地就可以写代码,练练手,下面就介绍一下如何在手机上写java程序吧。1、下载安装软件软件名:JavaN-IDE-AndroidBuilder-JavaSECompiler2、进入软件刚开始进入时,会提示你创建工程、包名、主方法类,…

    2022年7月9日
    19
  • linux异步IO编程实例分析

    linux异步IO编程实例分析linux异步IO编程实例分析

    2022年5月2日
    28

发表回复

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

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