Java 关于AbstractCollection实现

Java 关于AbstractCollection实现,java,list,collections,Java,List,Collections,我查看了一个集合,发现containsAll方法遍历整个集合。 为什么此方法不检查集合的大小?如果主集合只有一个元素,而目标集合有100000个元素,则性能会降低 ArrayList还重写了比较列表大小和0的方法isEmpty。为什么这个方法会被覆盖,并被这样的实现覆盖?AbstractCollection具有几乎相同的实现 非常感谢它不检查集合的大小,因为大小不必相同 如果一个列表中有重复的元素,containsAll仍然可以返回true: AbstractCollection<Inte

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

ArrayList还重写了比较列表大小和0的方法isEmpty。为什么这个方法会被覆盖,并被这样的实现覆盖?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'

HashMap
的实现与
ArrayList

中的实现相同,它不检查集合的大小,因为大小不必相同

如果一个列表中有重复的元素,
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'
并且
HashMap
的实现与
ArrayList

中的实现相同,MAV是正确的:

在AbstractCollection的源代码中检查containsAll()还表明它不需要进行大小检查:

  public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))//here its sort of size proof, also check indexOf in ArrayList
                return false;
        return true;
    }
public boolean containsAll(集合c){
用于(对象e:c)
如果(!contains(e))//这里是它的大小证明,也检查ArrayList中的indexOf
返回false;
返回true;
}
该方法在第一次检查失败时返回。
(两个列表之间的大小差异或第一个不存在的值)

另外,hashset不依赖于父方法,而是依赖于支持HashMap的isEmpty(它同样会覆盖像ArrayList一样的isEmpty)

MAV是正确的:

在AbstractCollection的源代码中检查containsAll()还表明它不需要进行大小检查:

  public boolean containsAll(Collection<?> c) {
        for (Object e : c)
            if (!contains(e))//here its sort of size proof, also check indexOf in ArrayList
                return false;
        return true;
    }
public boolean containsAll(集合c){
用于(对象e:c)
如果(!contains(e))//这里是它的大小证明,也检查ArrayList中的indexOf
返回false;
返回true;
}
该方法在第一次检查失败时返回。
(两个列表之间的大小差异或第一个不存在的值)


另外,hashset不依赖于父方法,而是依赖于支持HashMap的isEmpty(它同样会覆盖类似ArrayList的isEmpty)

Ok,但还有两个问题:1)如果第一个集合根本没有任何元素怎么办2)hashset为什么依赖于父方法?@sbjavateam check包含在AbstractCollection中,而在ArrayList中包含indexOf,大小差异不会导致任何不必要的迭代(性能开销)或错误。另外,开发人员可能更喜欢通过重写isEmpty来使用可用的大小状态(正如MAV所提到的),这些API从1.2版开始就出现了,可能是他们考虑到了一些小的性能提升。好的,但是还有另外两个问题:1)如果第一个集合根本没有任何元素怎么办2)为什么HashSet依赖父方法?@sbjavateam check包含在AbstractCollection中,而indexOf包含在ArrayList中,大小差异不会导致任何不必要的迭代(性能开销)或错误。此外,开发人员可能更喜欢通过覆盖isEmpty(如MAV所述)来使用可用的大小状态,这些API自版本1.2以来就已经存在,可能他们的想法中有一些小的性能增益。