HashMap中推荐使用entrySet方式遍历Map类集合KV而不是keySet方式遍历

我们先来做一个测试

public class HashMapTest {
    private HashMap<String, String> map = new HashMap<>();

    @Before
    public void beforeAllMethodTestInClass() {
        for (int i = 0; i < 100000; i++) {
            map.put("a" + i, "aa" + i);
            map.put("b" + i, "bb" + i);
            map.put("c" + i, "cc" + i);
            map.put("d" + i, "dd" + i);
        }
    }

    @Test
    public void entrySetTest() {
        Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();

        long startTime = System.currentTimeMillis();
        while (it.hasNext()) {
            Map.Entry<String, String> entry = it.next();
            System.out.println(entry.getKey() + "=" + entry.getValue());
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }

    @Test
    public void keySetTest() {
        Iterator<String> it = map.keySet().iterator();

        long startTime = System.currentTimeMillis();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key + "=" + map.get(key));
        }
        long endTime = System.currentTimeMillis();
        System.out.println(endTime - startTime);
    }

}
多次测试,我们可以发现方法keySetTest()时间大约为2s809ms,
entrySetTest()只有2s98ms,从测试上来说,后者运行时间小于前者。


原来,因为entrySet遍历的时候,存放的是Map.Entry<T, T>类型,
意思是,在进行遍历的时候已经把key、value放入其中。
而keySet遍历的时候,存放的是T类型,
意思是,在进行遍历的时候只放了key值,
倘若我还需要value,就还需要使用 public V get(Object key) 方法

注:本博客旨在记录,不作任何商用,如有侵犯,请联系博主(1258971228@qq.com)删除!

 

posted @ 2019-11-14 15:05  uzxin  阅读(421)  评论(0编辑  收藏  举报