迭代器 Iterator
阿新 • • 發佈:2021-01-22
迭代器 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);