在AbstractSet.removeAll()有两个代码将mark设置为已修改。摘要设置不同的逻辑
AbstractSet是
public boolean removeAll(Collection<?> c) {
boolean modified = false;
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext();)
modified |= remove(i.next()); //1
} else {
for (Iterator<?> i = iterator(); i.hasNext();) {
if (c.contains(i.next())) {
i.remove(); //2
modified = true; //2
}
}
}
return modified;
}
可能是什么背后的逻辑第二(// 2)不是modified |= remove(i.next());
作为第一(// 1)?
我会重写第二个(// 2)与第一个(// 1)相同,以免额外检查(contains(i.next())
)。
public boolean removeAll(Collection<?> c) {
boolean modified = false;
if (size() > c.size()) {
for (Iterator<?> i = c.iterator(); i.hasNext();)
modified |= remove(i.next()); //1
} else {
for (Iterator<?> i = iterator(); i.hasNext();) {
i.next();
modified |= i.remove()); //2
}
}
return modified;
}
UPDATE1:i.remove()
返回void。 Update2:i.remove()会清空不受欢迎的结果集。 根据update1,update2这个重写不起作用。
它是'| =',而不是'!='!重要的区别! –
链接已损坏。 –
@StephenC谢谢。更正了链接:)! – Willmore