list是一个ArrayList的对象,哪个选项的代码填写到//todo delete处,可以在Iterator遍历的过程中正确并安全的删除一个list中保存的对象?( )
Iterator it = list.iterator();
int index = 0;
while (it.hasNext()){
Object obj = it.next();
if (needDelete(obj)) { //needDelete返回boolean,决定是否要删除
//todo delete
}
index ++;
}
A)list.remove(obj);
B)list.remove(index);
C)list.remove(it.next());
D)it.remove();
选择什么?为什么?
------解决方案--------------------
it.remove();
在循环中的时候,list千万不要删除自身的对象,要用it删
------解决方案--------------------
选D,其他的抛 java.util.ConcurrentModificationException异常。
可以看看api的解释:
例如:某个线程在 Collection 上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE 提供的所有通用 collection 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。