日期:2014-05-20  浏览次数:20749 次

一个选择题,不明白,求指教
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 实现)可能选择抛出此异常。执行该操作的迭代器称为快速失败 迭代器,因为迭代器很快就完全失败,而不会冒着在将来某个时间任意发生不确定行为的风险。