2019独角兽企业重金招聘Python工程师标准>>>
首先是两段代码的执行结果:
代码一:
public class TestListRemove {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {Integer val = it.next();if (val == 1) {list.remove(val);}}for (Integer i : list) {System.out.println(i);}}
}
代码二:
public class TestListRemove {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {Integer val = it.next();if (val == 6) {list.remove(val);}}for (Integer i : list) {System.out.println(i);}}
}
代码一结果:
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
at java.util.ArrayList$Itr.next(ArrayList.java:791)
at com.odling.test.TestListRemove.main(TestListRemove.java:21)
代码二结果:
1
2
3
4
5
7
原因就是这里:
首先代码一抛错是这段代码:
Integer val = it.next();
final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}
这个异常网上很多文章就不说了。
AbsrtactList中iteraor方法返回一个内部类,这个类实现了iterator接口,hasNext()对cursor和list的size判断。
关于cursor的参数说明:
int cursor; // index of next element to return
如果删除了倒数第二个元素,拿代码二举栗子:cursor返回6,size因为被remove掉一个,所以也是6,hasNext()方法返回false,不会再执行Integer val = it.next(); 所以代码二没有异常,但是元素确实被remove了。
public boolean hasNext() {return cursor != size();}
再来看一下对代码一的改进:
public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);list.add(6);list.add(7);for (Iterator<Integer> it = list.iterator(); it.hasNext();) {try {Integer val = it.next();if (val == 1) {list.remove(val);}} catch (Exception e) {System.out.println("发生异常。");break;}}for (Integer i : list) {System.out.println(i);}}
结果:
发生异常。
2
3
4
5
6
7
发现元素确实已经被remove掉了。