




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、java中map的遍历方法及性能测试这篇文章主要介绍了 java中map的遍历方法及性能测试,本文讲解对hashmap> treemap进 行对比测试,给岀测试代码、测试结果和测试结论,需要的朋友可以参考下1阐述对于java中map的遍历方式,很多文章都推荐使用entryset,认为其比keyset的效率高很 多。理由是:entryset方法一次拿到所有key和value的集合;而keyset拿到的只是key的 集合,针对每个key,都要去map中额外查找一次value,从而降低了总体效率。那么实际 情况如何呢?为了解遍历性能的真实差距,包括在遍历key+value>遍历key、遍
2、历value等不同场景下的 差异,我试着进行了一些对比测试。2.对比测试一开始只进行了简单的测试,但结果却表明keyset的性能更好,这一点让我很是费解,不 都说entryset明显好于keyset吗?为了进一步地进行验证,于是采用了不同的测试数据进 行更详细的对比测试。2.1测试数据2.1.1 hashmap测试数据hashmap-1,大小为 100 万,key 和 value 均为 string, key 的值为 1、2、31000000:复制代码代码如下:map<string, string> map = new hashmap<string, string>()
3、; string key, value;for (i = 1; i <= num; i+) key = ,n + i;value = "value"map.putfkey, value);hashmap-2,大小为 100 万,key 和 value 均为 string, key 的值为 50、100> 250、200、50000000:复制代码代码如下:map<string, string> map = new hashmap<string, strjng>();string key, value;for (i = 1; i <=
4、 num; i+) key = "" + (i * 50);value = “value"map.put(key, value);2.1.2 treemap测试数据treemap-1,大小为 100 7j, key 和 value 均为 string, key 的值为 1、2、31000000:复制代码代码如下:map<string, string> map = new treemap<string, string>();string key, value;for (i = 1; i <= num; i+) key = ,h + i;
5、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 = ,u + (i * 50);value = "value"map.put(ke
6、y, value);2.2测试场景分别使用keyset> entryset和values的多种写法测试三种场景:遍历key+value>遍历key> 遍历value的场景。2.2.1 遍历 key+valuekeyset 遍历 key+value (写法 1):复制代码代码如下:lterator<string> iter = map.keyset().iterator();while (iter.hasnextf) key = iter. next();value = map.get(key);keyset 遍历 key+value (写法 2 ):复制代码代码如
7、下:for (string key : map.keyset() value = map.get(key);entryset 遍历 key+value (写法 1):复制代码代码如下:lterator<entryvstring, string>> iter = map.entryset()iterator();entry<string, string> entry;while (iter.hasnext() entry = iter. next();key = en try.getkey();value = en try.getvalue();entryset 遍
8、历 key+value (写法 2):复制代码代码如下:for (entry<string, string> entry: map.entryset() key = en try.getkey();value = entry.getvalue();2.2.2 遍历 keykeyset 遍历 key (写法 1):复制代码代码如下:lterator<string> iter = map.keyset().iterator(); while (iter.hasnext() key = iter.next(); keyset 遍历 key (写法 2):复制代码代码如下:fo
9、r (string key : map.keyset() entryset 遍历 key (写法 1):复制代码代码如下:lterator<entryvstring, string>> iter = map.entryset().iterator(); while (iter.hasnext() key = iter.next().getkey();entryset 遍历 key (写法 2 ):复制代码代码如下:for (entry<string, string> entry: map.entryset() key = en try.getkey();2.2.3
10、 遍历 valuekeyset 遍历 value (写法 2):复制代码代码如下:lterator<string> iter = map.keyset().iterator(); while (iter.hasnext() value = map.get(iter. next(); keyset 遍历 value (写法 2):复制代码代码如下:for (string key : map.keyset() value = map.get(key); entryset 遍历 value (写法 1):复制代码代码如下:lterator<entryvstring, string&
11、gt;> iter = map.entryset()iterator(); while (iter.hasnext() value = iter. next()getvalue();entryset 遍历 value (写法 2):复制代码代码如下:for (entry<string, string> entry: map.entryset() value = entry.getvaluef);values 遍历 value (写法 2):复制代码代码如下:lterator<string> iter = map.values().iterator!); while
12、 (iter.hasnextf) value = iter. next();values 遍历 value (写法 2):复制代码代码如下:for (string value : map.values() 2.3测试结果2.3.1 hashmap测试结果单位:毫秒hashmap-1hashmap-2keyset 遍历 key+value (写法 1)3993keyset 遍历 key+value (写法 2)3887entryset 遍历 key+value (写法 1)4386单位:毫秒hashmap-lhashmap-2keyset遍历key (写法1)2765keyset遍历key (写
13、法2 )2664entryset 遍历 key (写法 2)3474单位:毫秒hashmap-1hashmap-2keyset 遍历 value (写法 1)3887entryset 遍历 value (写法 1)3461entryset 遍历 value (写法 2)3262values 遍历 value (写法 1)2648values 遍历 value (写法 2)262.3.2 treemap测试结果单位:毫秒treemap-1treemap-2keyset 遍历 key+value (写法 1)430451keyset 遍历 key+value (写法 2)429450entryse
14、t 遍历 key+value (写法 1)77847068单位:毫秒treemap-1treemap-2keyset遍历key (写法1)5049keyset遍历key (写法2)49486664entryset 遍历 key (写法 2 )6563单位:毫秒treemap-1treemap-2keyset 遍历 value (写法 1)432448448entryset 遍历 value (写法 1)6261entryset 遍历 value (写法 2)6261values 遍历 value (写法 1)46463. 结论 3.1如果你使用hashmap1. 同时遍历key和value时,
15、keyset与entryset方法的性能差异取决于key的具体情况,如 复杂度(复杂对彖)、离散度、冲突率等。换言之,取决于hashmap查找value的开销。 entryset 一次性取出所有key和value的操作是有性能开销的,当这个损失小于hashmap查 找value的开销时,entryset的性能优势就会体现出来。例如上述对比测试中,当key是最 简单的数值字符串时,keyset nj'能反而会更高效,耗时比entryset少10%。总体來说还是推 荐使用entryseto因为当key很简单时,其性能或许会略低于keyset,但却是可控的;而随 着key的复杂化,entry
16、set的优势将会明显体现出来。当然,我们可以根据实际情况进行选 择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<string, string> en
17、try: map.entryset() key = en try.getkey();value = en try.getvalue();for (string value : map.values() 3.2如果你使用treemap1.同时遍历key和value时,与hashmap不同,entryset的性能远远高于keyset。这是由 treemap的查询效率决定的,也就是说,treemap查找value的开销较大,明显高于entryset 一次性取出所有key和value的开销。因此,遍历treemap时强烈推荐使用entryset方法。2. 只遍历key时,keyset方法更为合适,因为entryset将无用的value也给取出来了,浪费 了性能和空间。在上述测试结果中,keyset比entryset方法耗吋少24%。3. 只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 电子商务平台区域经销商网络合作协议
- 数据挖掘工程师跨区域合作合同
- 国际化新材料专利许可与全球市场研发合作协议
- 抗癌生物制药研发有限合伙人投资协议
- 影视版权代理与影视行业培训教育合作协议
- 小红书平台店铺综合运营与品牌推广合作协议
- 影视后期剪辑师聘用及影视版权合作合同
- 跨界合作影视剧本改编权转让合同
- 农业生态农场合伙人生态农业农业保险合作协议
- 豪宅房产优先购买权转让及执行协议
- 7.1 自由平等的真谛 课件- 2024-2025学年八年级道德与法治下册 统编版
- 2025年内蒙古中煤蒙大新能源化工有限公司招聘笔试参考题库附带答案详解
- 插画版权授权协议书
- 地理西亚+课件-2024-2025学年七年级地理下册人教版
- 放射科质量管理制度
- 科研助理笔试题库及答案
- 产品上市计划
- CHINET2024年全年细菌耐药监测结果
- 药物临床试验质量管理规范解读
- 膀胱癌健康宣教课件
- X线腰椎临床意义
评论
0/150
提交评论