为什么并发修改foreach方法而不是for循环
why concurrent modification on foreach method but not on for loop
ArrayList<Integer> targets = new ArrayList<Integer>();
targets.add(2);
targets.add(2);
for (Integer testInt : targets )
{
targets.add(1);
}
我收到一个 concurrentModificationException,但是有正常的 for 循环。我没有任何例外。
在正常的 forloop 中,如:-
for(int i=0;i<target.size();i++)
{
System.out.println(target.get(i));
target.add(22); //no exception
target.remove(2) // no exception
}
ForEach 循环不会直接在您的集合上循环。它使用后面的集合的迭代器。您可以在您的集合实现中看到迭代器。
735
736 public Iterator<E> More ...iterator() {
737 return new Itr();
738 }
An optimized version of AbstractList.Itr
742
743 private class More ...Itr implements Iterator<E> {
744 int cursor; // index of next element to return
并且您的 foreach 循环等于
for(Iterator<Integer> i = targets.iterator(); i.hasNext(); ) {
Integer element = i.next();
//To do
}
所以如果你在这里做任何操作,同时你修改集合,引擎盖下的迭代器会混淆并抛出异常。
来自JLS
List<? extends Integer> l = ...
for (float i : l) ...
将被翻译成:
for (Iterator<Integer> #i = l.iterator(); #i.hasNext(); ) {
float #i0 = (Integer)#i.next();
...
ArrayList<Integer> targets = new ArrayList<Integer>();
targets.add(2);
targets.add(2);
for (Integer testInt : targets )
{
targets.add(1);
}
我收到一个 concurrentModificationException,但是有正常的 for 循环。我没有任何例外。 在正常的 forloop 中,如:-
for(int i=0;i<target.size();i++)
{
System.out.println(target.get(i));
target.add(22); //no exception
target.remove(2) // no exception
}
ForEach 循环不会直接在您的集合上循环。它使用后面的集合的迭代器。您可以在您的集合实现中看到迭代器。
735
736 public Iterator<E> More ...iterator() {
737 return new Itr();
738 }
An optimized version of AbstractList.Itr
742
743 private class More ...Itr implements Iterator<E> {
744 int cursor; // index of next element to return
并且您的 foreach 循环等于
for(Iterator<Integer> i = targets.iterator(); i.hasNext(); ) {
Integer element = i.next();
//To do
}
所以如果你在这里做任何操作,同时你修改集合,引擎盖下的迭代器会混淆并抛出异常。
来自JLS
List<? extends Integer> l = ...
for (float i : l) ...
将被翻译成:
for (Iterator<Integer> #i = l.iterator(); #i.hasNext(); ) {
float #i0 = (Integer)#i.next();
...