专业IT网络知识平台,分享IT百科知识、生活百科知识解答!

易企推科技
易企推科技

entrySet()使用方法,Map集合的entrySet和keySet区别

来源:小易整编  作者:小易  发布时间:2023-02-03 11:50
摘要:entrySet()使用方法,Map集合的entrySet和keySet区别1.阐述  对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和v...

entrySet()使用方法,Map集合的entrySet和keySet区别

1. 阐述

  对于Java中Map的遍历方式,很多文章都推荐使用entrySet,认为其比keySet的效率高很多。理由是:entrySet方法一次拿到所有key和value的集合;而keySet拿到的只是key的集合,针对每个key,都要去Map中额外查找一次value,从而降低了总体效率。那么实际情况如何呢?

  为了解遍历性能的真实差距,包括在遍历key+value、遍历key、遍历value等不同场景下的差异,我试着进行了一些对比测试。

2. 对比测试

  一开始只进行了简单的测试,但结果却表明keySet的性能更好,这一点让我很是费解,不都说entrySet明显好于keySet吗?为了进一步地进行验证,于是采用了不同的测试数据进行更详细的对比测试。

2.1 测试数据

2.1.1 HashMap测试数据

HashMap-1,大小为100万,key和value均为String,key的值为1、2、3……1000000:

Map<String, String> map = new HashMap<String, String>();String key, value;for (i = 1; i <= num; i++) {key = "" + i;value = "value"; map.put(key, value);}

HashMap-2,大小为100万,key和value均为String,key的值为50、100、150、200、……、50000000:

Map<String, String> map = new HashMap<String, String>();String key, value;for (i = 1; i <= num; i++) {key = "" + (i * 50);value = "value";map.put(key, value);}

2.1.2 TreeMap测试数据

TreeMap-1,大小为100万,key和value均为String,key的值为1、2、3……1000000:

Map<String, String> map = new TreeMap<String, String>();String key, value;for (i = 1; i <= num; i++) {key = "" + i;value = "value";map.put(key, value);}

TreeMap-2,大小为100万,key和value均为String,key的值为50、100、150、200、……、50000000,更离散:

Map<String, String> map = new TreeMap<String, String>();String key, value;for (i = 1; i <= num; i++) {key = "" + (i * 50);value = "value";map.put(key, value);}

2.2 测试场景

分别使用keySet、entrySet和values的多种写法测试三种场景:遍历key+value、遍历key、遍历value的场景。

2.2.1 遍历key+value

keySet遍历key+value(写法1):Iterator

keySet遍历key+value(写法2):for (String key : map.keySet()) { value = map.get(key);}

entrySet遍历key+value(写法1):Iterator<Entry

entrySet遍历key+value(写法2):for (Entry

2.2.2 遍历key

keySet遍历key(写法1):Iterator

keySet遍历key(写法2):for (String key : map.keySet()) {}

entrySet遍历key(写法1):Iterator<Entry

entrySet遍历key(写法2):for (Entry

2.2.3 遍历value

keySet遍历value(写法1):Iterator

keySet遍历value(写法2):for (String key : map.keySet()) { value = map.get(key);}

entrySet遍历value(写法1):Iterator<Entry

entrySet遍历value(写法2):for (Entry

values遍历value(写法1):Iterator

values遍历value(写法2):for (String value : map.values()) {}

2.3 测试结果

2.3.1 HashMap测试结果

entrySet()使用方法,Map集合的entrySet和keySet区别

2~noop

entrySet()使用方法,Map集合的entrySet和keySet区别

2.3.2 TreeMap测试结果

entrySet()使用方法,Map集合的entrySet和keySet区别

entrySet()使用方法,Map集合的entrySet和keySet区别

entrySet()使用方法,Map集合的entrySet和keySet区别

3. 结论

3.1 如果你使用HashMap

1、同时遍历key和value时,keySet与entrySet方法的性能差异取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等。换言之,取决于HashMap查找value的开销。entrySet一次性取出所有key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet的性能优势就会体现出来。例如上述对比测试中,当key是最简单的数值字符串时,keySet可能反而会更高效,耗时比entrySet少10%。总体来说还是推荐使用entrySet。因为当key很简单时,其性能或许会略低于keySet,但却是可控的;而随着key的复杂化,entrySet的优势将会明显体现出来。当然,我们可以根据实际情况进行选择

2、只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。在上述测试结果中,keySet比entrySet方法耗时少23%。

3、只遍历value时,使用vlaues方法是最佳选择,entrySet会略好于keySet方法。

4、在不同的遍历写法中,推荐使用如下写法,其效率略高一些:

for (String key : map.keySet()) { value = map.get(key);}

for (Entry

for (String value : map.values()) {}

3.2 如果你使用TreeMap

1、同时遍历key和value时,与HashMap不同,entrySet的性能远远高于keySet。这是由TreeMap的查询效率决定的,也就是说,TreeMap查找value的开销较大,明显高于entrySet一次性取出所有key和value的开销。因此,遍历TreeMap时强烈推荐使用entrySet方法。

2、只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。在上述测试结果中,keySet比entrySet方法耗时少24%。

3、只遍历value时,使用vlaues方法是最佳选择,entrySet也明显优于keySet方法。

4、在不同的遍历写法中,推荐使用如下写法,其效率略高一些:

for (String key : map.keySet()) { value = map.get(key);}

for (Entry

for (String value : map.values()) {}


本文地址:IT百科频道 https://www.hkm168.com/tags/903023.html,易企推百科一个免费的知识分享平台,本站部分文章来网络分享,本着互联网分享的精神,如有涉及到您的权益,请联系我们删除,谢谢!


IT百科
小编:小易整编
相关文章相关阅读
  • 有没有录制电脑屏幕的方法

    有没有录制电脑屏幕的方法

    电脑屏幕有录制的方法吗有两个方法一是用win10电脑自带的录屏软件来录,打游戏的时候按一下【win+g】就行了二是用其他的录制软件来录制,比如“迅捷屏幕录像工具”,操作方法如下:1、首先在电脑上将这个工具下载下来。下载完成后打开工具,主页...

  • win7硬件加速设置方法

    win7硬件加速设置方法

    有很多网民在玩一些游戏或运行一些大软件,下载大文件,可能会觉得系统运行不够无忧无虑,这次可以尝试加速硬件。下面的小边将为您介绍如何设置win7的硬件加速方法。1.右击桌面空白处,然后点击右键菜单中的屏幕分辨率选项。2.进入电脑屏幕分辨率设置...

  • 迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办-迅雷下载速度慢解决方法

    迅雷下载速度慢怎么办?迅雷是目前国内用户使用最多的高速下载工具,其速度和效率都是同类下载工具的顶点,但是很多用户在使用的时候却发现迅雷的下载速度很慢,这其实是因为多个不同的问题导致的,那么我们该如何解决呢?下面就由小编为大家带来迅雷下载速度...

  • java中tostring方法的作用是什么

    java中tostring方法的作用是什么

    java中tostring方法的作用是会返回一个【以文本方式表示】此对象的字符串,结果是一个简明但易于读懂的信息表达式。java中tostring方法的作用是toString方法会返回一个“以文本方式表示”此对象的字符串。结果是一个简明但易...

  • 电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大 秒懂:电脑内存扩大内存的方法

    电脑运行内存怎么扩大?这是许多电脑用户常常遇到的问题。想要提升电脑运行速度和性能,扩大内存是一个有效的方法。但是,如何扩大内存呢?在本文中,php小编西瓜将为你介绍一些简单又实用的方法,让你秒懂如何扩大电脑内存,提升电脑的运行效率。无论你是...

  • 修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    修复 Windows 11 中 Sxstrace.exe 运行时错误的 5 种方法

    windows用户有时会发现启动程序很困难,在这种情况下可能会收到一条错误消息,要求使用命令行sxstrace.exe工具了解更多详细信息。sxstrace.exe由Microsoft于2006年11月首次为Windo...

  • CSS颜色设置方法:HEX、RGB、HSL的简单对比

    CSS颜色设置方法:HEX、RGB、HSL的简单对比

    css中,颜色值有多种表示方法,例如颜色名、十六进制颜色、rgb()、hex()、hsl()等等。那你知道hex、rgb和hsl之间有什么区别吗?下面本篇文章就来给大家简单对比一下hex、rgb、hsl,看看它们区别。不知道你是否了解HE...

  • 如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    如何解决 Windows 7 远程桌面出现黑屏的问题:11 种方法

    远程桌面连接(rdc)是专业版和企业版windows上的一项有用功能,允许用户远程连接到另一台计算机,而无需其他软件。但是windows11远程桌面上的黑屏可能会毁掉这一切。黑屏问题是用户遇到的最常见问题之一。你想知道为什么屏...

  • 周排行
  • 月排行
  • 年排行

精彩推荐