gpt4 book ai didi

java - Abstract设置不同的逻辑

转载 作者:行者123 更新时间:2023-12-02 05:31:52 25 4
gpt4 key购买 nike

AbstractSet.removeAll()有两个代码将设置标记为已修改。

抽象集是

   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) 没有像第一个 (//1) 那样 modified |= remove(i.next()); 背后的逻辑是什么?

我会将第二个 (//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。更新2:i.remove()会清空集合,这是不受欢迎的结果。基于update1、update2这个重写是行不通的。

最佳答案

在迭代时从 Collection(调用了 removeAllSet)中安全删除元素的唯一方法是使用Iteratorremove方法。使用 remove(i.next()) 将抛出 ConcurrentModificationException

另一方面,第一个循环不会迭代要从中删除元素的 Set (它迭代作为参数传递的 Collection )。因此可以安全地调用 remove(i.next())

这两个循环之间的另一个区别是,在第一个循环中,remove(i.next()) 不保证从 Set 中删除任何内容(因为元素要删除的内容可能不在 Set 中),因此您需要对 remove 调用的所有结果进行“或”运算以确定是否删除了任何内容。这就是 modified |= remove(i.next()); 的原因。

另一方面,当使用Iterator的remove时,你肯定知道一个元素被删除了(这可能就是为什么Iterator的remove不被删除的原因返回任何内容 - 如果确实如此,它将始终返回 true),因此您只需在删除第一个元素后将 modified 设置为 true 即可。

编辑:

关于您的编辑,建议重写第二个循环以删除 contains(i.next()) 检查 - 甚至忽略 modified |= i.remove() 中的编译错误) (由 Iterator 的移除的 void 返回类型导致),这会清空 Set 而不是只移除 c< 的元素 存在于 Set 中。

关于java - Abstract设置不同的逻辑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41978986/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com