迭代器 Iterator
在ArrayList等类创建迭代器之后,除非通过迭代器自身remove或add对列表结构进行修改,否则在其他线程中以任何形式对列表进行修改,迭代器马上会抛出异常,快速失败。
(1)异常1: IndexOutOfBoundsException
List<Integer> l = new ArrayList<Integer>();
l.add(100);
l.add(200);
l.add(0);
l.add(555);
l.add(666);
System.out.println("初始size = "+l.size());
int size = l.size();
for (int n=0;n<size;n++){
if(l.get(n)==200){
l.remove(n);
}
}
System.out.println("现在size="+l.size() + l);
//可以删除,但出现IndexOutOfBoundsException
(2)异常2: ConcurrentModificationException
List<Integer> l = new ArrayList<Integer>();
l.add(100);
l.add(200);
l.add(0);
l.add(555);
l.add(666);
System.out.println("初始size = "+l.size());
for(Integer n:l){
if(n==200){
l.remove(n);
}
}
System.out.println("现在size=" + l.size() + l);
//会抛出异常 ConcurrentModificationException
正确操作
List<Integer> l = new ArrayList<Integer>();
l.add(100);
l.add(200);
l.add(0);
l.add(555);
l.add(666);
System.out.println("初始size = "+l.size());
Iterator<Integer> iterator = l.iterator();
while (iterator.hasNext()){
Integer next = iterator.next();
if(next == 200){
iterator.remove(); //也可以add
}
}
System.out.println("现在size="+l.size() + l);