HashMap两种遍历数据的方式

HashMap的遍历有两种方式,一种是entrySet的方式,另外一种是keySet的方式。

第一种利用entrySet的方式:

Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();Object key = entry.getKey();Object val = entry.getValue();
}

上面的方式可以变化为for循环的形式:

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

第二种利用keySet的方式:

Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {Object key = iter.next();Object val = map.get(key);
}

上面的方式也可以变化为for循环的形式:

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {map.get(key);
}

这两种方式那种效率高呢?可以从下面的试验可以看出来:

public class Test
{public static void main(String[] args){HashMap<String, String> map = new HashMap<String, String>();for (int i = 0; i < 1000000; i++){map.put(i + "", "hello world");}long begin1 = System.currentTimeMillis();Iterator iterator1 = map.entrySet().iterator();while (iterator1.hasNext()){Map.Entry entry = (Map.Entry) iterator1.next();Object key1 = entry.getKey();Object val1 = entry.getValue();}long end1 = System.currentTimeMillis();System.out.println("map.entrySet方式变量花费的时间为:" + (end1 - begin1));long begin2 = System.currentTimeMillis();Iterator iterator2 = map.keySet().iterator();while (iterator2.hasNext()){Object key2 = iterator2.next();Object val2 = map.get(key2);}long end2 = System.currentTimeMillis();System.out.println("map.keySet方式变量花费的时间为:" + (end2 - begin2));}
}

结论:
经过运行多次,我发现两者的运行时间相差不多,而且没有明确显示出那种变量方式更快一些。有的人可能会觉得第一种变量方式会快一些,因为他们觉 得:keySet方式其实是遍历了2次,一次是转为iterator,一次就从HashMap中取出key所对应的value,而entry方式只遍历了 一次,把key和value都放到了entry中,所以entry方式更快一些。
但是我觉得这种分析的方式比较主观,我们更应该从源码的角度去分析。首先看一下迭代器的源码:

keySet的迭代器:

private final class KeyIterator extends HashIterator<K> {public K next() {return nextEntry().getKey();}
}

entrySet的迭代器:

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

从上面我们可以看到只是返回值不同而已,父类相同,所以性能相差不多。下面我们再看一下get方法的源码:

public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}
final Entry<K,V> getEntry(Object key) {
int hash = (key == null) ? 0 : hash(key);
for (Entry<K,V> e = table[indexFor(hash, table.length)];
e != null;
e = e.next) {
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k))))
return e;
}
return null;
}

从上面的源码发现get的时间复杂度取决于for循环循环次数,即hash算法。所以两种性能差别不大。从上面的分析来看,我们得到最终的结论:
(1)HashMap的循环,如果既需要key也需要value,直接用下面的即可,foreach简洁易懂。

Map<String, String> map = new HashMap<String, String>();
for (Entry<String, String> entry : map.entrySet()) {entry.getKey();entry.getValue();
}

(2)如果只是遍历key而无需value的话,可以直接用下面的方式:

Map<String, String> map = new HashMap<String, String>();
for (String key : map.keySet()) {// key process
}

原文地址:http://swiftlet.net/archives/1259

转载于:https://www.cnblogs.com/longshiyVip/p/4633190.html

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

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

相关文章

jOOQ类型安全数据库查询教程

课程大纲 SQL是用于关系数据库查询的功能强大且表达能力强的语言。 SQL已建立&#xff0c;标准化并且几乎不受其他查询语言的挑战。 但是&#xff0c;在Java生态系统中&#xff0c;自从JDBC以来&#xff0c;几乎没有采取任何相关的措施来更好地将SQL集成到Java中。 在更高级别上…

中专计算机专业学c语言吗,中专计算机专业学什么 有哪些课程

计算机原理、计算机应用基础、计算机网络基础、CAD辅助设计、三维动画设计、VBSIC语言及程序设计PHOTOSHOP、Windows、网页设计、Office办公自动化、多媒体、计算机系统安装及维护管理、计算机病毒原理防范等。计算机专业就业前景计算机专业就业前景很好。随着现代经济和科技的…

教你玩转CSS表格(table)

目录 表格边框 折叠边框 表格宽度和高度 表格文字对齐 表格填充 表格颜色 表格边框 指定CSS表格边框,使用border属性。 下面的例子指定了一个表格的Th和TD元素的黑色边框: table, th, td {border: 1px solid black;}

实战|全程分析js到getshell

本篇转载于https://forum.butian.net/share/260 看到望海师傅的山理证书真滴好看&#xff0c;真想搞一本&#xff0c;刚刚入edusrc的时候收集了一波山理的子域资产&#xff0c;全部看了一遍都被大佬挖的干干净净了。没有内网VPN基本上挖不到&#xff0c;然后我就去公众号看了一…

教你吃透CSS的盒子模型(Box Model)

目录 CSS 盒子模型(Box Model) 元素的宽度和高度 浏览器的兼容性问题 CSS 盒子模型(Box Model) 所有HTML元素可以看作盒子,在CSS中,”box model”这一术语是用来设计和布局时使用。 CSS盒模型本质上是一个盒子,封装周围的HTML元素,它包括:边距,边框,填充,和实际内容…

多家防火墙设备存在信息泄露漏洞

概述 漏洞名称多家防火墙设备存在信息泄露漏洞安全通告发布日期2021-06-16受影响产品及版本胜鑫塔下一代防火墙XT6000-A-FW-1.0.0-0-2778 利谱第二代防火墙6164-1.5.2 任子行下一代防火墙SURF-NGSA-V-3000 中科网威下一代防火墙F6600L-1.5.2 任子行网络安全审计系统内置报表 网…

c语言 linker error,[Linker error] undefined reference to `prinf'的问题!

[Linker error] undefined reference to prinf的问题&#xff01;环境为dev-cpp日志如下&#xff1a;编译器: Default compiler执行 gcc.exe...gcc.exe "E:\C\ran.c" -o "E:\C\ran.exe" -I"D:\Dev-Cpp\include" -L"D:\Dev-Cpp\lib"C:\…

独处可以激发思考的力量

如果你知道怎么独处的话&#xff0c;成大事者都是善于独处的人&#xff0d;&#xff0d;在独处的过程中激发思考的力量。 自卑可以像一座大山把人压倒并让你永远沉默&#xff0c;也可以像推进器产生强大的动力。 比别人先走一步&#xff0c;能创造一种成功的心境。 在独处时&am…

教你玩转CSS border(边框)

目录 边框样式 border-style 值 边框宽度 边框颜色 边框-单独设置各边 实例 边框-简写属性 CSS 边框属性

从命令式功能到纯功能性,然后再返回:Monads与范围内的延续

这则影片随附此文章&#xff0c;没有它不会有太大意义 上个月&#xff0c;我在Curry On会议上做了演讲&#xff0c;该会议是与学术&#xff0c;编程语言会议ECOOP共同举办的新会议。 Curry On旨在弥合学术界之间的鸿沟。 我的学术兴趣不包括编程语言&#xff0c;我认为编程语言…

php boolean 全大写还是全小写,【PHP培训】PHP为什么大小写规则是如此不规则?

据 但还是建议使用统统敏感的写法&#xff0c;推荐大家始终坚持“大小写敏感”&#xff0c;遵循统一的代码规范&#xff0c;不定义大小相同的函数和方法。 一、大小写敏感 1.变量名区分大小写 所有变量均区分大小写&#xff0c;包括普通变量以及$_GET,$_POST,$_REQUEST,$_C…

c语言调用话筒的程序,c – OpenAL:如何创建简单的“麦克风回声”程序?

一个古老的问题,但这是一个答案.如果我们真的想要简洁,它肯定可以修剪,但这有点不到100条有效线&#xff1a;#include // OpenAL header files#include #include using std::list;#define FREQ 22050 // Sample rate#define CAP_SIZE 2048 // How much to capture at a time (a…

轶事奇语

---恢复内容开始--- Windows自带的记事本编辑文本时&#xff0c;如果使用utf-8编码的文件&#xff0c;会在每个文件开头添加一个值为0xefbbbf字符&#xff0c;会导致许多奇怪的问题&#xff0c;如网页第一行可能会显示一个"?", 或编译器报语法错误&#xff0c;等。U…

教你玩转CSS 轮廓(outline)属性

目录 CSS 轮廓&#xff08;outline&#xff09; 所有CSS 轮廓&#xff08;outline&#xff09;属性 CSS 轮廓&#xff08;outline&#xff09; 轮廓&#xff08;outline&#xff09;是绘制于元素周围的一条线&#xff0c;位于边框边缘的外围&#xff0c;可起到突出元素的作用…

单片机c语言参考文献最新,[2018年最新整理]10个单片机C语言实例.doc

[2018年最新整理]10个单片机C语言实例经典单片机实验帮你成功1&#xff0e; 闪烁灯1&#xff0e; 实验任务如图4.1.1 所示&#xff1a;在P1.0 端口上接一个发光二极管L1&#xff0c;使L1 在不停地一亮一灭&#xff0c;一亮一灭的时间间隔为0.2 秒。2&#xff0e; 电路原理图图4…

Web安全-伪静态网页

初步认识 “伪静态”顾名思义就是一种表面上看似是静态网页&#xff08;以.html、.htm等结尾&#xff09;&#xff0c;不存在任何的数据交互&#xff0c;却其实是动态网页&#xff0c;存在数据交互的网站&#xff0c;具有这种特性的网页被称为“伪静态网页”。我们看到的伪静态…

2015.7.11js-10(无缝滚动)

1.实现原理&#xff1a;setInterval定时器&#xff0c;让某元素position的left属性定时滚动&#xff0c;使用到js中的元素的offsetLeft属性。 2.案例&#xff1a;1.css的实现是外div是4张图片的总宽度&#xff0c;设置relative然后overflow隐藏。子代有ul层设置为absolute;left…

教你玩转CSS margin(外边距)

目录 margin 可能的值 Margin - 单边外边距属性 Margin - 简写属性 所有的CSS边距属性 margin margin 清除周围的(外边框)元素区域。margin 没有背景颜色,是完全透明的。 margin 可以单独改变元素的上,下,左,右边距,也可以一次改变所有的属性。

某高校2006年招收学生3千人c语言,C语言程序设计例题

C语言程序课程设计任务书一、题目每个同学可从下列给出的参考题目中任选一题完成&#xff0c;也可以自选题目。1.完成一个学生成绩管理系统。内容描述&#xff1a;设计四个类&#xff1a;学生基本信息&#xff1b;成绩表&#xff1b;班级表&#xff1b;课程表(描述课程信息&…

j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围

j2ee 和 j2se我们目前正在考虑重构Naked Objects框架&#xff0c;以使用JSR-330&#xff08;依赖注入&#xff09;和面向EE的老大哥JSR-299&#xff08;CDI&#xff09;。 使用香草JSR-330是不费吹灰之力的&#xff0c;但是我们想利用JSR-299中的一些不错的功能&#xff08;例如…