分析輪子(八)- List.java 各類遍歷方式及遍歷時移除元素的方法

注:玩的是JDK1.7版本java

1:先嚐栗子,再分析,代碼簡單,註釋清晰,可自玩一下oop

/**
 * @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,這種方式自己就是存在問題的,不可以使用 spa

 

 3)按以下方式遍歷時移除元素,須要先調用 next()方法,不然會拋出 java.lang.IllegalStateExceptioncode

 

4)以下是編譯器的語法糖,以及正確的遍歷時移除元素的示範,前面兩種方式blog

相關文章
相關標籤/搜索