Java Map遍历方式的选择

发表于:2013-4-11 09:31

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:最初的幸福ever    来源:51Testing软件测试网采编

  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<String> iter = map.keySet().iterator(); 
while (iter.hasNext()) { 
    key = iter.next(); 
    value = map.get(key); 
}

  keySet遍历key+value(写法2):

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

41/41234>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号