关于集合中的remove:
- 当集合的结构发生改变时,迭代器必须重新获取,如果还用以前的迭代器,会出现异常:java.util.ConcurrentModificationException
- 在迭代集合元素的过程中,不能调用集合对象的remove方法,c1.remove()去删除元素
Iterator it=c.iterator();
获取的迭代器对象,迭代器是用来遍历集合,此时相当于对当前集合的状态拍了一个快照
迭代器迭代对象的时候会参照这个快照进行迭代
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
/*
关于集合中的remove:
当集合的结构发生改变时,迭代器必须重新获取,如果还用以前的迭代器,会出现异常:java.util.ConcurrentModificationException
在迭代集合元素的过程中,不能调用集合对象的remove方法,c1.remove()去删除元素
*/
/*
Iterator it=c.iterator();
获取的迭代器对象,迭代器是用来遍历集合,此时相当于对当前集合的状态拍了一个快照
迭代器迭代对象的时候会参照这个快照进行迭代
*/
public class Collectionremove {
public static void main(String[] args) {
//创建集合
Collection c=new ArrayList();
/*
注意:此时获取的迭代器,指向的是集合中没有元素状态下的迭代器。
集合结构只要发生改变,迭代器必须重新获取!!!!!
当集合结构发生了改变,迭代器没有重新获取的时候,调用next方法时,java.util.ConcurrentModificationException
*/
// Iterator it=c.iterator();
//添加元素
c.add(4); //Integer类型
c.add(5);
c.add(6);
//获取迭代器
Iterator it=c.iterator();
while(it.hasNext()){
//写代码时,next方法返回值类型必须是Object,不能这样写Integer i=it.next();
Object o=it.next();
System.out.println(o);
}
Collection c1=new ArrayList();
c1.add("avf");
c1.add("ert");
c1.add("exo");
Iterator it2=c1.iterator();
while(it2.hasNext()){
Object o1=it2.next();
//删除元素
//删除元素后,集合结构发生了变化,应该重新获取迭代器
//但是,循环下一次的时候并没有重新获取迭代器,所以会出现异常java.util.ConcurrentModificationException
//出异常的根本原因:集合中元素删除了,但是没有通知迭代器(迭代器不知道集合变化了)
// c1.remove(o1); 直接通过集合去删除元素,并没有通知迭代器,导致迭代器的快照和原集合状态不同
//使用迭代器来删除元素
//迭代器去删除的时候,会自动更新迭代器,并且更新集合(删除集合中的元素)
it2.remove(); //删除的一定是迭代器指向的当前元素
System.out.println(o1);
}
System.out.println(c1.size());//0
}
}