Java HashMap遍历几种方式

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunshuo1231/article/details/78208565

概述

遍历HashMap有三种情况:遍历key+value,遍历key,遍历value。常用的方法有两种:keySet方法,entrySet方法等。

遍历key+value

keySet()方法:

iterator 形式

public class Demo01 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()) {
            String k = iterator.next();
            String v = map.get(k);
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

foreach形式:

public class Demo02 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        for(String k : map.keySet()) {
            String v = map.get(k);
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

entrySet()方法:
iterator形式:

public class Demo03 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String k = entry.getKey();
            String v = entry.getValue();
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

foreach形式:

public class Demo04 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        for (Map.Entry<String, String> entry :  map.entrySet()) {
            String k = entry.getKey();
            String V =  entry.getValue();
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

遍历key

keySet()方法
iterator形式:

public class Demo05 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        Iterator<String> iterator = map.keySet().iterator();
        while(iterator.hasNext()) {
            String k = iterator.next();
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

foreach形式:

public class Demo06 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        for(String k : map.keySet()) {
            System.out.println(k);
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

entrySet()方法
iterator形式:

public class Demo07 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while(iterator.hasNext()) {
            Map.Entry<String, String> entry = iterator.next();
            String k = entry.getKey();
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

foreach形式:

public class Demo08 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        for (Map.Entry<String, String> entry :  map.entrySet()) {
            String k = entry.getKey();
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

遍历value

keySet和entrySet类似与Demo01到Demo04,除了keySet和entrySet方法,遍历vlaue还有values()方法:

public class Demo09 {
    public static void main(String[] args) {
        Map<String, String> map = new HashMap<String, String>();
        StringBuilder key = new StringBuilder();
        StringBuilder value = new StringBuilder();
        for (int i = 0; i < 10000; i++) {
            key.append(String.valueOf(i));
            value.append("value").append(String.valueOf(i));
            map.put(key.toString(), value.toString());
        }
        long start = System.currentTimeMillis();
        for(String v : map.values()) {
            System.out.println(v);
        }
        long end = System.currentTimeMillis();
        System.out.println("遍历所需时间:" + (end - start) + "ms");
    }
}

总结

  1. 同时遍历key和value时,keySet与entrySet方法的性能差异取决于key的具体情况,如复杂度(复杂对象)、离散度、冲突率等。换言之,取决于HashMap查找value的开销。entrySet一次性取出所有key和value的操作是有性能开销的,当这个损失小于HashMap查找value的开销时,entrySet的性能优势就会体现出来。当key是最简单的数值字符串时,keySet可能反而会更高效,耗时比entrySet少。总体来说还是推荐使用entrySet。因为当key很简单时,其性能或许会略低于keySet,但却是可控的;而随着key的复杂化,entrySet的优势将会明显体现出来。当然,我们可以根据实际情况进行选择
  2. 只遍历key时,keySet方法更为合适,因为entrySet将无用的value也给取出来了,浪费了性能和空间。
  3. 只遍历value时,使用vlaues方法是最佳选择,entrySet会略好于keySet方法。
  4. 在不同的遍历写法中,推荐使用foreach写法,其效率略高一些。

测试参考一位牛人实测给出
http://www.cnblogs.com/fczjuever/archive/2013/04/07/3005997.html

猜你喜欢

转载自blog.csdn.net/sunshuo1231/article/details/78208565