• 分析轮子(八)- List.java 各种遍历方式及遍历时移除元素的方法


    注:玩的是JDK1.7版本

    1:先尝栗子,再分析,代码简单,注释清晰,可自玩一下

    /**
     * @description:测试集合遍历和移除元素的方式
     * @author:godtrue
     * @create:2018-09-13
     */
    public class TestTraverseStyle {
        /**
         * 开始循环的基值
         */
        private static final int START_LOOP = 1;
    
        /**
         * 结束循环的基值
         * 我的机器 1亿 次就卡死了,我就实验下 1千万 次吧! 10000000
         */
        private static final int END_LOOP = 10000000;
    
        /**
        *
        *@description: 测试入口,主方法
        *@param args
        *@return: void
        *@author: godtrue
        *@createTime: 2018-09-13
        *@version: v1.0
        */
        public static void main(String[] args) {
    
            List<String> list = genList();
    
            /**
             * 循环list的方式一及其变种
             */
            //traverseByLoop(list);
            //traverseByLoop1(list);
            //traverseByLoop2(list);
            //traverseByLoop3(list);
            //traverseByLoop4(list);
    
            /**
             * 循环list的方式二及其变种
             */
            //traverseByIterator(list);
            //traverseByIterator2(list);
            //traverseByIteratorForeach(list);
    
            /**
             * 遍历时移除元素,会抛出 java.lang.IndexOutOfBoundsException
             */
            //traverseByLoopRemoveEle(list);
            /**
             * 遍历时移除元素,需要先调用 next()方法,否则会抛出 java.lang.IllegalStateException
             */
            traverseByIteratorRemoveEle(list);
            traverseByIteratorRemoveEle2(list);
            /**
             * 遍历时移除元素,会抛出 java.util.ConcurrentModificationException,这种方式本身就是存在问题的,不可使用
             */
            //traverseByIteratorForeachRemoveEle(list);
        }
    
        /**
        *
        *@description: 循环遍历 list 集合,不推荐的方式,多次获取集合的长度
        *@param list
        *@return: void
        *@author: godtrue
        *@createTime: 2018-09-13
        *@version: v1.0
        */
        private static void traverseByLoop(List list){
            long startTime = System.currentTimeMillis();
            for(int i=0;i<list.size();i++){
                list.get(i);
            }
            System.out.println("exe traverseByLoop cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 循环遍历 list 集合,推荐的方式,性能好一些,只获取一次集合长度,且集合的长度可以继续使用
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoop1(List list){
            long startTime = System.currentTimeMillis();
            int sum=list.size();
            for(int i=0;i<sum;i++){
                list.get(i);
            }
            System.out.println("exe traverseByLoop1 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 循环遍历 list 集合,推荐的方式,性能好一些,只获取一次集合长度,集合长度不在循环外使用
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoop2(List list){
            long startTime = System.currentTimeMillis();
            for(int i=0,sum=list.size();i<sum;i++){
                list.get(i);
            }
            System.out.println("exe traverseByLoop2 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 循环遍历 list 集合,从尾部开始遍历
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoop3(List list){
            long startTime = System.currentTimeMillis();
            for(int sum=list.size()-1;sum>=0;sum--){
                list.get(sum);
            }
            System.out.println("exe traverseByLoop3 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 循环遍历 list 集合,从尾部开始遍历
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoop4(List list){
            long startTime = System.currentTimeMillis();
            for(int sum=list.size();sum>0;){
                list.get(--sum);
            }
            System.out.println("exe traverseByLoop4 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
        *
        *@description: 迭代遍历 list 集合
        *@param list
        *@return: void
        *@author: godtrue
        *@createTime: 2018-09-13
        *@version: v1.0
        */
        private static void traverseByIterator(List list){
            long startTime = System.currentTimeMillis();
              for (Iterator i=list.iterator(); i.hasNext(); ){
                  i.next();
              }
            System.out.println("exe traverseByIterator cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 迭代遍历 list 集合
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByIterator2(List list){
            long startTime = System.currentTimeMillis();
            Iterator i=list.iterator();
            while (i.hasNext()){
                i.next();
            }
            System.out.println("exe traverseByIterator2 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 迭代遍历 list 集合,编译器的语法糖
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByIteratorForeach(List list){
            long startTime = System.currentTimeMillis();
            for (Object o : list){
            }
            System.out.println("exe traverseByIteratorForeach cost time : "+(System.currentTimeMillis()-startTime));
        }
    
    
        /**
         *
         *@description: 循环遍历 list 集合时,移除元素,这是一种错误的示范
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoopRemoveEle(List list){
            long startTime = System.currentTimeMillis();
            for(int i=0,sum=list.size();i<sum;i++){
                list.remove(list.get(i));
            }
            System.out.println("exe traverseByLoopRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 迭代遍历 list 集合时,移除元素,这是一种有效的方式
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByIteratorRemoveEle(List list){
            long startTime = System.currentTimeMillis();
            for (Iterator i=list.iterator(); i.hasNext(); ){
                i.next();
                i.remove();
            }
            System.out.println("exe traverseByIteratorRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 迭代遍历 list 集合时,移除元素,这是一种有效的方式
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByIteratorRemoveEle2(List list){
            long startTime = System.currentTimeMillis();
            Iterator i=list.iterator();
            while (i.hasNext()){
                i.next();
                i.remove();
            }
            System.out.println("exe traverseByIteratorRemoveEle2 cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
         *
         *@description: 迭代遍历 list 集合时,移除元素,这是一种错误的示范
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByIteratorForeachRemoveEle(List list){
            long startTime = System.currentTimeMillis();
            for (Object o : list){
                list.remove(o);
            }
            System.out.println("exe traverseByIteratorForeachRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
        }
    
        /**
        *
        *@description:  生成 ArrayList 数据信息
        *@param
        *@return: java.util.List<java.lang.String>
        *@author: godtrue
        *@createTime: 2018-09-13
        *@version: v1.0
        */
        private static List<String> genList(){
            long startTime = System.currentTimeMillis();
            List<String> list = new ArrayList<String>();
            for(int i = TestTraverseStyle.START_LOOP; i< TestTraverseStyle.END_LOOP; i++){
                list.add(String.valueOf(i));
            }
            System.out.println("exe genList cost time : "+(System.currentTimeMillis()-startTime));
            return list;
        }
    
    
    }

    2:注意事项

    1)按如下方式循环遍历 list 集合时,移除元素,会抛出 java.lang.IndexOutOfBoundsException

        /**
         *
         *@description: 循环遍历 list 集合时,移除元素,这是一种错误的示范
         *@param list
         *@return: void
         *@author: godtrue
         *@createTime: 2018-09-13
         *@version: v1.0
         */
        private static void traverseByLoopRemoveEle(List list){
            long startTime = System.currentTimeMillis();
            for(int i=0,sum=list.size();i<sum;i++){
                list.remove(list.get(i));
            }
            System.out.println("exe traverseByLoopRemoveEle cost time : "+(System.currentTimeMillis()-startTime));
        }

    2)按如下方式循环遍历 list 集合时,移除元素,会抛出 java.util.ConcurrentModificationException,这种方式本身就是存在问题的,不可使用 

     3)按如下方式遍历时移除元素,需要先调用 next()方法,否则会抛出 java.lang.IllegalStateException

    4)如下是编译器的语法糖,以及正确的遍历时移除元素的示范,前面两种方式

  • 相关阅读:
    Flask——session
    UISB ScrollView
    UISB 登陆
    UISB TextField
    UISB 进步器 分栏控制器
    UISB UISlider ProgressView
    UISB Switch
    UISB 定时器
    Django-Celery文档
    UISB UIViewController
  • 原文地址:https://www.cnblogs.com/godtrue/p/9643105.html
Copyright © 2020-2023  润新知