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
)相似:起初看起来似乎是错误的,但是如果明智地使用它,则可以使代码更简洁。