• 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删除方式不会报出异常。
     

  • 相关阅读:
    嵌入式Linux基础知识
    面向对象程序设计与原则
    设计模式之工厂模式
    设计模式之单例模式
    基于Doxygen的C/C++注释原则
    设计模式概论
    重启博客
    java 单例模式的几种写法
    CountDownLatch、CyclicBarrier
    java ConcurrentHashMap和CopyOnWriteArrayList解决并发问题
  • 原文地址:https://www.cnblogs.com/coloz/p/10766933.html
Copyright © 2020-2023  润新知