阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

科技资讯 投稿 4700 0 评论

阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

Map在我们Java程序员高频使用的一种数据结构,Map的遍历方式也有很多种,那那种方式比较高效呢,今天就带大家一起验证下。

【推荐】使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历。 

1:通过for和map.entrySet(方式遍历。

// Map初始化 private static Map<String,Integer> initMap(int count{ AlternativeJdkIdGenerator alternativeJdkIdGenerator = new AlternativeJdkIdGenerator(; Map<String,Integer> map = new HashMap<>(; for (int i = 0; i < count; i++ { map.put(alternativeJdkIdGenerator.generateId(.toString(,i ; } return map ; }

int count = 1000000;
        Map<String,Integer> map =initMap(count ;
        // 为了计算平均值,分别循环三次进行遍历
        for (int i = 0; i < 3; i++ {
            Instant start;
            Instant end;
            start = Instant.now(;
            for (Map.Entry<String, Integer> entry : map.entrySet( {
                // 一般遍历map就是获取key和value
                String  result="key为:"+entry.getKey(+",value为:"+entry.getValue(;
            }
            end = Instant.now(;
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end.toMillis( + "ms";
        }

运行三次的结果如下:(平均值:368.33ms)

​2、通过 for, Iterator 和 map.entrySet( 来遍历

int count = 1000000; Map<String,Integer> map =initMap(count ; for (int i = 0; i < 3; i++ { Instant start; Instant end; start = Instant.now(; for (Iterator<Map.Entry<String,Integer>> entries = map.entrySet(.iterator(; entries.hasNext(; { Map.Entry<String,Integer> entry = entries.next(; String result ="key为:"+entry.getKey(+",value为:"+entry.getValue(; } end = Instant.now(; System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end.toMillis( + "ms"; }

​运行三次的结果如下:(平均值:339.66ms

 

 int count = 1000000;
        Map<String,Integer> map =initMap(count ;
        for (int i = 0; i < 3; i++ {
            Instant start;
            Instant end;
            start = Instant.now(;
            for (String key : map.keySet( {
                String result ="key为:"+key+",value为:"+map.get(key;
            }
            end = Instant.now(;
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end.toMillis( + "ms";
        }

运行三次的结果如下:(平均值:379.66ms

  int count = 1000000;
        Map<String,Integer> map =initMap(count ;
        for (int i = 0; i < 3; i++ {
            Instant start;
            Instant end;
            start = Instant.now(;
            for (Iterator<String> key = map.keySet(.iterator(; key.hasNext(;  {
                String k = key.next(;
                String result ="key为:"+k+",value为:"+map.get(k;
            }
            end = Instant.now(;
            System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end.toMillis( + "ms";
        }

运行三次的结果如下:(平均值330.33ms

 5、通过 map.forEach( 来遍历

int count = 1000000; Map<String,Integer> map =initMap(count ; for (int i = 0; i < 3; i++ { Instant start; Instant end; start = Instant.now(; map.forEach((key, value -> { String result ="key为:"+key+",value为:"+map.get(value; }; end = Instant.now(; System.out.println("遍历循环" + count + "次耗时:" + Duration.between(start, end.toMillis( + "ms"; }

​运行三次的结果如下:(平均值506.33ms

 

看过 HashMap 源码的同学应该会发现,这个遍历方式【entrySet(】在源码中也有使用,如下图所示。

 

 ​Spring的源码也有很多的Map,大神们遍历的方式也都基本使用entrySet(遍历如下:

 所以开发中也建议使用entrySet(来遍历Map。

编程笔记 » 阿里巴巴建议这样遍历Map,今天就用几种方式做个比较一下看那种最好用

赞同 (19) or 分享 (0)
游客 发表我的评论   换个身份
取消评论

表情
(0)个小伙伴在吐槽