注:玩的是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