在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