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