Java中几种遍历map的方式的性能比较

上一篇测试了list的几种遍历方式的性能,下边我们测试下map的遍历方式的性能。

首先map的遍历一般有以下几种:

  1. jdk8中新增的lambda遍历,map.forEach
  2. 遍历entrySet
  3. 遍历keySet,然后取出value

代码如下:

public static void main(String[] args) {
    Map<Integer,Integer> map= IntStream.range(0, 1000000).boxed().collect(Collectors.toMap((a)->a,(a)->a+1));
    int times = 10000;

    //lambda:66071(ms)
    long startTime = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
      lambda(map);
    }
    System.out.println("lambda:" + (System.currentTimeMillis() - startTime));

    //foreach_entry:91749
    startTime = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
      foreach_entry(map);
    }
    System.out.println("foreach_entry:" + (System.currentTimeMillis() - startTime));


    //foreach_key:123859
    startTime = System.currentTimeMillis();
    for (int i = 0; i < times; i++) {
      foreach_key(map);
    }
    System.out.println("foreach_key:" + (System.currentTimeMillis() - startTime));

  }

  private static void lambda(Map<Integer,Integer> map){
    int count[] = new int[]{0};
    map.forEach((k,v)->{
      if((k+v)%2==0){
        count[0] = count[0] + 1;
      }
    });
  }

  private static void foreach_entry(Map<Integer,Integer> map){
    int count[] = new int[]{0};
    for(Map espanolcialis.net.Entry<Integer,Integer> entry:map.entrySet()){
      if((entry.getKey()+entry.getValue())%2==0){
        count[0] = count[0] + 1;
      }
    }
  }

  private static void foreach_key(Map<Integer,Integer> map){
    int count[] = new int[]{0};
    for(Integer k:map.keySet()){
      if((k+map.get(k))%2==0){
        count[0] = count[0] + 1;
      }
    }
  }

可以看出lambda的方式性能最高,其次是遍历entrySet。

以上测试较为简单,并不能百分百的衡量几种遍历方式的真实性能,在实际环境中遇到过lamdba性能不如遍历entrySet的场景。所以在性能要求高的场景中最好实际测试下

此条目发表在技术分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。