如图方式遍历删除集合元素,会抛出 java.lang.IllegalStateException
package jihe;
import typeinfo.pets.Mutt;
import typeinfo.pets.Pet;
import typeinfo.pets.Pets;
import typeinfo.pets.Rat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
public class SimpleIteration {
public static void main(String[] args) {
/*while (it.hasNext()) {
Pet p = it.next();
System.out.println(p.id() + ":" + p + " ");
}
System.out.println();
for (Pet p : pets) {
System.out.println(p.id() + ":" + p + " ");
}
System.out.println();
it = pets.iterator();*/
/* for (int i = 0; i < 12; i++) {
it.next();
it.remove();
}*/
List<Pet> pets = Pets.arrayList(12);
System.out.println(pets);// [Rat, Manx, Cymric, Mutt, Pug, Cymric, Pug, Manx, Cymric, Rat, EgyptianMau, Hamster]
Iterator<Pet> it = pets.iterator();
while (it.hasNext()){
// it.next();
it.remove();
}
// java.lang.IllegalStateException 备注:先使用it.hasNext() 在使用it.next()
System.out.println(pets);// [Pug, Manx, Cymric, Rat, EgyptianMau, Hamster]
}
}
去看源码,就是line:863-864
lastRet 就是上次上次操作的最后角标,默认初始化时-1;
hasNext()方法不会改变 lastRet 字段的值;所以在执行remove()方法时会抛出异常;
next()方法,返回当前的元素,并将lastRet 的值改变为当前光标值cursor(一般刚开始是0);