开发者社区> 问答> 正文

Map遍历效率问题,效率是不是还是得和数据量有关系?

今天在网上看到 一个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),是不是单纯的下效率问题不能一概而论(

展开
收起
爵霸 2016-05-31 14:38:56 3566 0
1 条回答
写回答
取消 提交回答
  • 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遍历的内部实现要更复杂一些,出现第三个测试结果也不用惊讶,在编程的时候,优先选用第一种遍历方法。

    2019-07-17 19:21:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
RowKey与索引设计:技巧与案例分析 立即下载
数据带来无限可能 立即下载
存储分层企业数据存储类型选择与优化 立即下载