List list = new ArrayList(); String[] arr = new String[]{"1,2,3,4"}; for(int i = 0;i < arr.length;i++){ System.out.println(arr[i]); } for(int i = 0;i < list.size();i++){ System.out.println(list.get(i)); }
foreach 惯用法:
String[] arr = new String[]{"1,2,3,4"}; List list = new ArrayList(); list.add("1"); list.add("2"); for(String str : arr){ System.out.println(str); } for (String item : list) { System.out.println(item); }
Iterator 惯用法:
Iterator it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); }
速度对比
性能是我们选取某一种技术手段的一种考虑方式,且看这三种遍历方式的速度对比
List list = new ArrayList(); long maxLoop = 2000000; for(long i = 0;i < maxLoop;i++){ list.add(i); }
// for循环 long startTime = System.currentTimeMillis(); for(int i = 0;i < list.size();i++){ ; } long endTime = System.currentTimeMillis(); System.out.println(endTime - startTime + "ms");
List list = new ArrayList(); list.add("1"); list.add("2"); for(int i = 0;i < list.size();i++){ if("2".equals(list.get(i))){ System.out.println(list.get(i)); list.remove(list.get(i)); } }
for循环可以直接进行remove,不会受到任何影响。
foreach 中的remove
List list = new ArrayList(); list.add("1"); list.add("2"); for (String item : list) { if ("2".equals(item)) { System.out.println(item); list.remove(item); } }
你觉得这段代码的正确输出是什么?我们一起来探究一下
当我执行一下这段代码的时候,出现了以下的情况
由以上异常情况的堆栈信息得知,程序出现了并发修改的异常,为什么会这样?我们从
错误
开始入手,
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
也就是这行代码,找到这行代码的所在地
finalvoidcheckForComodification(){ if (modCount != expectedModCount) thrownew ConcurrentModificationException(); }
List list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); Iterator it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); it.remove(); }
这是一种正确的写法,如果输出语句和 remove()方法互换顺序怎么样呢?
错误的遍历 —— next() 和 remove() 执行顺序的问题
List list = new ArrayList(); list.add("1"); list.add("2"); list.add("3"); Iterator it = list.iterator(); while (it.hasNext()){ it.remove(); System.out.println(it.next()); }
执行程序输出就会报错:
Exception in thread "main" java.lang.IllegalStateException at java.util.ArrayList$Itr.remove(ArrayList.java:872) at test.SimpleTest.main(SimpleTest.java:46)
这又是为什么?还是直接从错误入手:
定位到错误的位置
at java.util.ArrayList$Itr.remove(ArrayList.java:872)
List list = Arrays.asList("1","2","3"); Iterator it = list.iterator(); while (it.hasNext()){ System.out.println(it.next()); it.remove(); }
这段代码执行之后的输出是怎样的呢?
1 Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:161) at java.util.AbstractList$Itr.remove(AbstractList.java:374) at test.SimpleTest.main(SimpleTest.java:50)