今天在网上看到 一个Map遍历速度最优解的文章,文章中说:“对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,他把key和value都放到了entry中,所以就快了。”。然后我试了试速度
public static void mapUtils(){
Map<String, Object> map = new HashMap<>();
for (int i = 0; i < 50000; i++) {
map.put(i+"", i);
}
Iterator<Entry<String, Object>> iterator = map.entrySet().iterator();
long t1 = System.currentTimeMillis();
while(iterator.hasNext()) {
Entry<String, Object> next = iterator.next();
String key = next.getKey();
Object value = next.getValue();
//System.out.println("key:"+key+"-------value:"+value);
}
System.out.println("1消耗时间:"+(System.currentTimeMillis()-t1));
long t2 = System.currentTimeMillis();
for (String key : map.keySet()) {
map.get(key);
//System.out.println("key:"+key+"-------value:"+map.get(key));
}
System.out.println("2消耗时间:"+(System.currentTimeMillis()-t2));
}
5W数据的时候
1消耗时间:24
2消耗时间:27
10W数据的时候
1消耗时间:26
2消耗时间:38
相差0.012s。
1W数据的时候
1消耗时间:17
2消耗时间:15
2的消耗时间比1少了。
下面是电脑配置
但是像我们实际项目中,很少需要一次性遍历如此多的数据(我没有接触过大数据,今天毕业的实习生),我感觉如果数据量不是很多的话,使用keySet()的效率更高(但是相差是我们感觉不出来的,很多时候相差仅仅0.001s),是不是单纯的下效率问题不能一概而论(
hashmap使用key的hashcode映射到hashmap内部的存储数组(或者链表)的某一个位置上。在根据key查找value时,首先计算key的hashcode,然后取模,映射到内部存储数组,基于这种方式,hashmap.get()函数的复杂度是O(1),
在JDK1.5之前,遍历hashmap只能使用代码片段中的第二种方法,第一种方法是jdk1.5新增加的功能,第一种方法其实是遍历hashmap内部的一个维护的链表,第二种方法使用了hashmap.get函数,遍历keyset,即集合,所以,从复杂度上来说,第二种方法比第一种方法高,显示结果就是耗用的时间高。
但jdk种的hashmap是支持不同key但相同hash的,所以get,entrySet遍历的内部实现要更复杂一些,出现第三个测试结果也不用惊讶,在编程的时候,优先选用第一种遍历方法。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。