LinkedList:删除对象


问题内容

这是使用for每个循环从Java中的LinkedList中查找和删除项目的有效方法,是否可能会导致不一致:

for(ObjectType ob : obList) {
  if(ob.getId() == id) {
    obList.remove(ob);
    break;
   }
}

问题答案:

其他人提到有效点,通常这不是您如何remove从集合中获取对象。但是,在这种情况下,因为您break一旦退出循环就可以了remove

但是,如果要在之后继续迭代remove,则需要使用迭代器。否则,您将获得ConcurrentModificationException,或更普遍的情况是未定义的行为。

所以,是的, 如果您break不在别人foreach之后remove,您会没事的


对于那些说这将失败的人来说,因为您无法修改集合中的内容foreach-仅当您想保持迭代时,这才是正确的。这里不是这种情况,因此此快捷方式很好。

A
ConcurrentModificationException由迭代器检查并抛出。在此之后remove(称为并发修改),您将break退出循环。迭代器甚至没有机会检测到它。

最好在上添加注释break,为什么绝对必要等,因为 如果以后修改此代码以在a之后继续迭代remove,它将失败

我将这个习惯用法与goto(或更确切地说,标记为break/
continue)相似:起初看起来似乎是错误的,但是如果明智地使用它,则可以使代码更简洁。