这个操作安全吗?

Leo*_*eon 2 java containers iterator

这个操作安全吗?如果没有,为了做同样的事情,如何编写代码?

Set<Object> set;

......

for (Object o: set) {
    if (some_condition) {
        set.remove(o);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

不,它不是 - 因为除了通过迭代器之外,你不允许修改你正在迭代的集合.有各种方法可以解决这个问题.这是一个:

for (Iterator<Object> iterator = set.iterator(); iterator.hasNext(); )
{
    Object value = iterator.next();
    if (someCondition)
    {
        iterator.remove();
    }
}
Run Code Online (Sandbox Code Playgroud)

另一种选择是构建一个单独的要删除的项目列表,然后在迭代完集删除它们:

List<Object> itemsToRemove = new ArrayList<Object>();
for (Object x in set)
{
    if (someCondition)
    {
        itemsToRemove.add(x);
    }
}

set.removeAll(itemsToRemove);
Run Code Online (Sandbox Code Playgroud)