分析轮子(八)- 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)如下是编译器的语法糖,以及正确的遍历时移除元素的示范,前面两种方式

猜你喜欢

转载自www.cnblogs.com/godtrue/p/9643105.html