Java HashMap 遍历方式性能探讨

来源:互联网 发布:牛顿迭代法原理 知乎 编辑:程序博客网 时间:2024/05/22 18:11

JDK8之前,可以使用keySet或者entrySet来遍历HashMap,JDK8中引入了map.foreach来进行遍历


HashMap四种遍历查询方式耗时性能对比


Map<String, String> map = new HashMap<String, String>();
        int num = 5000000;
        String key, value;
        // 存放500万条数据
        for (int i = 1; i <= num; i++) {
            key = "" + i;
            value = "value";
            map.put(key, value);

     }


1.keySet:

    Map map=new HashMap();

    Iterator it=map.keySet().iterator();

    Object key;

    Object value;

    while(it.hasNext()){

    key=it.next();

    value=map.get(key);

    System.out.println(key+":"+value);

    }


时间:只获取key  50;获取key和value 170

2:entrySet:


    Map map=new HashMap();

    Iterator it=map.entrySet().iterator();

    Object key;

    Object value;

    while(it.hasNext()){

    Map.Entry entry = (Map.Entry)it.next();

    key=entry.getKey();

    value=entry.getValue();

    System.out.println(key+"="+value);

    }

时间:只获取key或获取value 时间差不多 110-140;获取key和value  140


3:      

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

时间:170   



4:

for (Entry<String, String> entry1 : map.entrySet()) {key = entry1.getKey();value = entry1.getValue();}

时间:130


比较:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。



2.1 使用Java8的foreach+lambda表达式遍历Map


    Map<String, Integer> items = new HashMap<>();

    items.put("A", 10);

    items.put("B", 20);

    items.put("C", 30);

    items.put("D", 40);

    items.put("E", 50);

    items.put("F", 60);

     

    items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));

     

    items.forEach((k,v)->{

        System.out.println("Item : " + k + " Count : " + v);

        if("E".equals(k)){

            System.out.println("Hello E");

        }

    });

时间:158


原创粉丝点击