public class Demo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("wangwu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}
运行结果
[zhangsan, lisi, zhaoliu]如果删错其他元素:
public class ItaratorDemo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("zhaoliu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}运行结果抛出异常:
我知道使用迭代器遍历集合删除元素的时候不能使用集合的方法删除元素,但是为什么我第一次删除倒数第二个元素的时候捕获抛出异常呢?
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("wangwu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}
运行结果
[zhangsan, lisi, zhaoliu]如果删错其他元素:
public class ItaratorDemo01 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator();
while (it.hasNext()) {
Object obj = it.next();
if ("zhaoliu".equals(obj)) {
list.remove(obj);
}
}
System.out.println(list);
}
}运行结果抛出异常:
我知道使用迭代器遍历集合删除元素的时候不能使用集合的方法删除元素,但是为什么我第一次删除倒数第二个元素的时候捕获抛出异常呢?
public class Test9 {
public static void main(String args[]) { List list = new ArrayList();
list.add("zhangsan");
list.add("lisi");
list.add("wangwu");
list.add("zhaoliu");
Iterator it = list.iterator(); while (it.hasNext()) {
Object obj = it.next();
System.out.println("===" + obj);
if ("zhaoliu".equals(obj)) {
it.remove();
}
}
System.out.println(list);
}}建议你看下迭代器的源码实现
删除的时候下list 和Iterator 没有做到同步
首先你要去看下list 迭代具体是怎么操作的
可以看下AbstractList的源码。
迭代是以cursor为准,而list是根据size
是靠比较他们俩往下执行的。
为什么删除倒数第二个没有报错,因为
当删除倒数第二个时候,也就是迭代到list倒数第二个元素时,删除此元素,
这时hasNex 返回的false,也就是不往下再进行了,所以不会执行到 it.next();
而next() 会检查cursor和size,才会报ConcurrentModificationException
你如果要问为什么hasNex 返回false,请看下hasNex 的实现
public boolean hasNext() {
return cursor != size();
}
如果你还接着问 cursor 和size的值,那我建议你看源码了。。