Map遍历方式

一.下面4种遍历方式

 /**
     * 1.keySet的for循环方式
     */
    //只获取key
    public static void keySetForGetKey(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        for (String key : map.keySet()) {
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySetForGetKey运行时间" + (endTime - startTime));
    }

    //获取key和value
    public static void keySetForGetKeyAndValue(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        for (String key : map.keySet()) {
            String value = map.get(key);
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySetForGetKeyAndValue运行时间" + (endTime - startTime));
    }

    /**
     * 2.keySet的iterator迭代器方式
     */
    //只获取key
    public static void keySetIteratorGetKey(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySetIteratorGetKey运行时间" + (endTime - startTime));
    }

    //获取key和value
    public static void keySetIteratorGetKeyAndValue(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        Iterator<String> iterator = map.keySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next();
            String value = map.get(iterator.next());
        }
        long endTime = System.currentTimeMillis();
        System.out.println("keySetIteratorGetKeyAndValue运行时间" + (endTime - startTime));
    }

    /**
     * 3.entrySet的for循环方式(个人比较喜欢)
     */
    //只获取key
    public static void entrySetForGetKey(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetForGetKey运行时间" + (endTime - startTime));
    }

    //获取key和value
    public static void entrySetForGetKeyAndValue(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetForGetKeyAndValue运行时间" + (endTime - startTime));
    }


    /**
     * 4.entrySet的iterator迭代器方式
     */
    //只获取key
    public static void entrySetIteratorGetKey(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next().getKey();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetIteratorGetKey运行时间" + (endTime - startTime));
    }

    //获取key和value
    public static void entrySetIteratorGetKeyAndValue(Map<String, String> map) {
        long startTime = System.currentTimeMillis();
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        while (iterator.hasNext()) {
            String key = iterator.next().getKey();
            String value = iterator.next().getValue();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("entrySetIteratorGetKeyAndValue运行时间" + (endTime - startTime));
    }

测试:----------------
    @Test
    public void test1() {
        Map<String, String> map = new HashMap<>();
        for (int i = 0; i < 600000; i++) {
            map.put("1443990001" + i, "6944804590104");
        }

        keySetForGetKey(map);
        keySetForGetKeyAndValue(map);
        keySetIteratorGetKey(map);
        keySetIteratorGetKeyAndValue(map);
        entrySetForGetKey(map);
        entrySetForGetKeyAndValue(map);
        entrySetIteratorGetKey(map);
        entrySetIteratorGetKeyAndValue(map);
        /*
        keySetForGetKey运行时间19
        keySetForGetKeyAndValue运行时间29
        keySetIteratorGetKey运行时间16
        keySetIteratorGetKeyAndValue运行时间27
        entrySetForGetKey运行时间19
        entrySetForGetKeyAndValue运行时间19
        entrySetIteratorGetKey运行时间17
        entrySetIteratorGetKeyAndValue运行时间21
         */
    }

 

 二.总结

 entrySet的方式整体都是比keySet方式要高一些;

单纯的获取key来说,两者的差别并不大,但是如果要获取value,还是entrySet的效率会更好,因为keySet需要从map中再次根据key获取value,而entrySet一次都全部获取出来;
iterator的迭代器方式比foreach的效率高。

(遍历获取key+value)效率 :     entrySet > keySet ;   iterator>foreach

 
 

foreach和iterator

其实foreach的语法只是对iterator进行了简单的包装,使用起来更加方便而已,

但是如果在foreach循环体内,对集合元素进行删除添加操作的时候,会报出ConcurrentModificationException,并发修改异常。

如果需要在遍历集合的时候对象集合中元素进行remove删除操作,需要使用iterator的遍历方式,iterator自带的remove删除方式不会报出异常。
 

 

posted @ 2019-04-25 10:43  将军上座  阅读(218)  评论(0编辑  收藏  举报