gpt4 book ai didi

java - 关于 AbstractCollection 实现

转载 作者:行者123 更新时间:2023-12-01 18:30:45 24 4
gpt4 key购买 nike

我查看了abstraccollection,发现containsAll方法会迭代整个集合。为什么此方法不检查集合的大小?如果主集合只有一个元素而目标集合有 100000 个元素,性能将会下降。

ArrayList 还重写了 isEmpty 方法,用于比较列表的大小和 0。为什么这个方法被重写并用这样的实现重写? AbstractCollection 具有几乎相同的实现。

非常感谢

最佳答案

它不检查集合的大小,因为大小不必相同。

如果一个列表中存在重复元素,containsAll 仍然可以返回 true:

AbstractCollection<Integer> first = new ArrayList<>();
AbstractCollection<Integer> second = new ArrayList<>();
first.add(1);
second.add(1);
second.add(1);

System.out.println(first.containsAll(second)); // Prints 'true'

要弄清楚为什么 isEmpty 是这样实现的,您可能需要询问制作它的开发人员。他们可能想避免调用 size() 的开销,以防编译器没有内联它。

<小时/>

编辑:Shay016 已经解决了这些问题,但我还是想将它们添加到我的答案中。

1) what if first collection does not have any element at all

如果它没有任何元素,containsAll 将在第一次 contains 检查时返回 false(它不会进行任何不必要的迭代),因此检查大小0 不会有太大区别(并且它会为 containsAll 的所有使用添加额外的比较)。因此,这样的检查可能被认为是不必要的。

2) why HashSet rely on parent's method ?

事实并非如此。它依赖于内部 HashMap 中的 isEmpty

public boolean isEmpty() {
return map.isEmpty();
}

HashMap的实现与ArrayList中的实现相同

关于java - 关于 AbstractCollection 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24341307/

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