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:

1
2
3
4
5
6
7
8
9
Map map=newHashMap();
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:

1
2
3
4
5
6
7
8
9
10
Map map=newHashMap();
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:

1
2
3
4
finalclass KeyIterator extendsHashIterator
        implementsIterator<K> {
        publicfinal K next() { returnnextNode().key; }
    }

entrySet:

1
2
3
4
finalclass EntryIterator extendsHashIterator
        implementsIterator<Map.Entry<K,V>> {
        publicfinal Map.Entry<K,V> next() { returnnextNode(); }
    }

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

2. Map.foreach

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

Map.foreach本质仍然是entrySet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
defaultvoid forEach(BiConsumer<? superK, ? superV> 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.
                thrownew ConcurrentModificationException(ise);
            }
            action.accept(k, v);
        }
    }

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Map<String, Integer> items = newHashMap<>();
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Raft共识算法

前提条件 Raft不考虑拜庭将军问题&#xff0c;即消息会延迟、丢失但不会错误。 Raft的特性 Strong leader&#xff1a;在 Raft 中&#xff0c;日志条目&#xff08;log entries&#xff09;只从 leader 流向其他服务器。 这简化了复制日志的管理&#xff0c;使得 raft 更容易…

直方图 帕累托图_如何发现现象背后的关键因素?帕累托图,质量管理的利器...

大家好&#xff1a;无论在日常生活还是工作中&#xff0c;都会发生一些事情或者结果&#xff0c;是我们不希望发生的。我们也希望从根本上解决掉&#xff0c;但有时候却无从下手&#xff0c;比如本来打算用来看书的时间不知道去哪里了&#xff1b;本来打算存款的钱也不知道去哪…

centos8上安装nginx

参考自 https://www.jianshu.com/p/9b2dd37a5af9 &#xff1b; 【1】安装步骤 step1&#xff09;安装nginx sudo yum install -y nginx step2&#xff09;启动nginx服务 -- 开机自启动 sudo systemctl enable nginx -- 开启nginx 服务 sudo systemctl start nginx step3&am…

简单分析KafKa工作原理

架构图 Producer&#xff1a;Producer即生产者&#xff0c;消息的产生者&#xff0c;是消息的入口。 kafka cluster&#xff1a; Broker&#xff1a;Broker是kafka实例&#xff0c;每个服务器上有一个或多个kafka的实例&#xff0c;我们姑且认为每个broker对应一台服务器。每…

Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析

转载自 Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析网上关于 HashMap 和 ConcurrentHashMap 的文章确实不少&#xff0c;不过缺斤少两的文章比较多&#xff0c;所以才想自己也写一篇&#xff0c;把细节说清楚说透&#xff0c;尤其像 Java8 中的 ConcurrentHashMap&#…

kali mysql停止服务器_MySQL 的主从复制(高级篇)

首先要明白为什么要用 mysql 的主从复制&#xff1a;1–在从服务器可以执行查询工作 (即我们常说的读功能)&#xff0c;降低主服务器压力&#xff1b;&#xff08;主库写&#xff0c;从库读&#xff0c;降压&#xff09;2–在从主服务器进行备份&#xff0c;避免备份期间影响主…

centos8安装并启动tomcat9

【1】 步骤如下 step1&#xff09; 下载tomcat9 step2&#xff09;centos8 输入 rz命令&#xff0c;把tomcat9 压缩包上传到centos8 没有rz命令&#xff0c; 安装使用 yum -y install lrzsz step3&#xff09;压缩包解压到tomcat9 step4&#xff09;配置jdk环境 vim /et…

unity 3d shaderlab 开发实战详解_vue实战开发011:使用router-view嵌套路由详解

前面已经把首页的顶部header和底部的footer页面写完&#xff0c;现在开始写内容区域了&#xff0c;在写内容之前我们先要将路由配置好&#xff0c;不然无法在页面上查看效果&#xff0c;所以这里我在components目录下先建了一个home.vue文件&#xff0c;里面简单的写了一句“我…

go 语言 error 处理的最佳实践

今天分享 go 语言 error 处理的最佳实践&#xff0c;了解当前 error 的缺点、妥协以及使用时注意事项。文章内容较长&#xff0c;干货也多&#xff0c;建议收藏 什么是 error 大家都知道 error[1] 是源代码内嵌的接口类型。根据导出原则&#xff0c;只有大写的才能被其它源码…

请求nginx静态资源报403

【README】 请求nginx静态资源报403&#xff1b; 【1】原因 静态资源防止在某个家目录下&#xff0c;如 /root 目录下 【2】 解决方法1 nginx.conf 文件没有指定用户 # user nobody 修改为 user root; # 设置为root用户 &#xff1b; 【例子】 user root; #使用r…

DDD中聚合的概念

DDD中的聚合模式是最难弄清楚的一种模式&#xff0c;在如何确定聚合边界这个问题上&#xff0c;更没有一个明确的指导原则&#xff0c;这导致DDD的落地比较难。不过&#xff0c;相信你读了这篇文章应该对聚合会有更深刻的理解。 本文分三部分来讲&#xff1a; 1、什么是聚合&a…

docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的&#xff0c;打成 jar 直接一键运行&#xff1f;打成 war 扔到 Tomcat 容器中运行&#xff1f;不过据松哥了解&#xff0c;容器化部署应该是目前的主流方案。不同于传统的单体应用&#xff0c;微服务由于服务数量众多&am…

MySQL日志:binlog、事务日志(redo、undo)

事务的隔离性是通过锁实现&#xff0c;而事务的原子性、一致性和持久性则是通过日志实现。Mysql的日志可以分为&#xff1a; binlog&#xff1a;server层实现事务日志&#xff1a;包括redo log、undo log&#xff0c;引擎层&#xff08;innodb&#xff09;实现 redo log red…

vmware安装centos8步骤

【readme】 vmware 安装centos8&#xff1b; 【1】新建虚拟机 step1&#xff09; 下载 centos8 http://download.nus.edu.sg/mirror/centos/8-stream/isos/x86_64/ 补充&#xff0c;通过代理服务器下载会快很多&#xff1b; step2&#xff09;vmare&#xff0c;点击文件&…

并发编程 – Concurrent 用户指南

转载自 并发编程 – Concurrent 用户指南1. java.util.concurrent – Java 并发工具包Java 5 添加了一个新的包到 Java 平台&#xff0c;java.util.concurrent 包。这个包包含有一系列能够让 Java 的并发编程变得更加简单轻松的类。在这个包被添加以前&#xff0c;你需要自己去…

小微企业名录查询系统_欢迎访问辽宁小微企业名录系统

欢迎访问辽宁小微企业名录系统http://xwqy.lngs.gov.cn辽宁小微企业名录系统是小微企业扶持政策的实施公示台、集装箱&#xff0c;通过访问该系统网站&#xff0c;及时全面知晓小微企业复工复产、“个转企”等各类扶持政策。按照《国务院关于扶持小型微型企业健康发展的意见》(…

常用限流算法分析

一、计数器&#xff08;固定窗口&#xff09;算法 计数器算法是使用计数器在周期内累加访问次数&#xff0c;当达到设定的限流值时&#xff0c;触发限流策略。下一个周期开始时&#xff0c;进行清零&#xff0c;重新计数。 此算法在单机还是分布式环境下实现都非常简单&#…

nginx学习小结

nginx 【0】README 本文po处理 nginx的主要内容&#xff0c;包括反向代理&#xff0c;负载均衡&#xff0c;动静分离&#xff0c;高可用集群等&#xff1b; 本文引用链接&#xff1a; vmware安装centos8&#xff0c;refer2 https://blog.csdn.net/PacosonSWJTU/article/detail…

缓存与数据库的一致性:先操作缓存还是先操作数据库?

数据缓存 在我们实际的业务场景中&#xff0c;一定有很多需要做数据缓存的场景&#xff0c;比如售卖商品的页面&#xff0c;包括了许多并发访问量很大的数据&#xff0c;它们可以称作是是“热点”数据&#xff0c;这些数据有一个特点&#xff0c;就是更新频率低&#xff0c;读…