67,515
社区成员
发帖
与我相关
我的任务
分享
List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if ("1".equals(temp)) {
a.remove(temp);
}
}
public static void main(String[] args) {
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("3");
//方法一
System.out.println("方法一删除前:" + list);
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
if ("3".equals(next)) {
iterator.remove();
}
}
System.out.println("方法一删除后:" + list);
//方法二
System.out.println("方法二删除前:" + list);
for (int i = 0; i < list.size(); i++) {
if ("2".equals(list.get(i))) {
list.remove(list.get(i));
--i;
}
}
System.out.println("方法二删除后:" + list);
}
个人见解,在遍历的时候,会先调用 public boolean hasNext() { return cursor != size; },但你删除1后,准备再次遍历时,这首cursor==size,都为1,hasNext返回false,不会再次调用next,也就不会再去调用checkForComodification这个方法,当你删除2的后,curosr=2,size=1,会去调用next,也就报错了,你可以试下,删除list的倒数第二个元素应该都不会报错,其他的都会,不对勿喷
基础知识:如果需要在遍历一个集合的过程中删除此集合的元素,请使用迭代器。
兄弟可以看下源码 增强for的底层还是用迭代器遍历的,迭代器实际上是集合的副本 在复制的时候会将集合内的计数器也一并进行复制,每一次使用迭代遍历集合中的元素 都会进行一次计数器的比较,也就是比较迭代器的计数器和集合的计数器是否相同 如果不同会产生并发修改异常 因为2是最后一个元素,所以此时迭代器遍历已经结束,所以再修改集合内容则不会报错 你可以试试再加几个元素,最后一个都是能成功的
额,你可以去搜下ConcurrentModificationException产生的原因