gpt4 book ai didi

java - 具有重复项的 "containsAll"的行为

转载 作者:行者123 更新时间:2023-11-30 07:49:52 26 4
gpt4 key购买 nike

official documentation containsAll 的 ( archive ) 仅表示“如果此列表包含指定集合的​​所有元素,则返回 true”。但是,我刚刚测试了这个:

List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(1);
List<Integer> list2 = new ArrayList<>();
list2.add(2);
list2.add(1);
list2.add(2);
System.out.println(list1.containsAll(list2));

结果是 true,即使 list1 不包含第二个 2

那么 containsAll 的官方的、完全定义的行为是什么?它是否表现得好像所有重复项都已从两个列表中删除?我记得在某处读到它会导致重复问题,但我不知 Prop 体情况。

最佳答案

List.containsAll方法的行为与记录的一样:如果给定集合的所有元素都属于此集合,则返回 true,否则返回 false。文档没有说明元素的顺序或基数。

containsAll 的文档没有明确说明它如何确定一个元素是否属于Collection。但是 contains 的文档(隐含地指定了“contains”的语义)确实如此:它使用了 equals。同样,没有提及基数。

containsAll 方法在 Collection 中声明接口(interface)并在 List 中重新声明和 Set接口(interface),但它首先在 Collection 中实现层次结构 AbstractCollection类,如下:

public boolean containsAll(Collection<?> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}

据我所知,此实现由实现 Collection 的大多数常见类继承。 Java Collections 框架中的接口(interface),除了 CopyOnWriteArrayList 类和其他专用类,例如空列表和已检查和不可变的包装器等。

因此,如果您查看代码,您会发现它符合您引用的文档:

Returns true if this list contains all of the elements of the specified collection.

AbstractList.containsAll 的文档中方法,还有一个 @implSpec 标记,它表示以下内容:

@implSpec

This implementation iterates over the specified collection, checking each element returned by the iterator in turn to see if it's contained in this collection. If all elements are so contained true is returned, otherwise false.

关于可能的优化,它们都被转发到 contains 方法的不同实现,该方法也由 AbstractCollection 实现以一种天真的、类似蛮力的方式。但是,contains 在即 HashSet 中被覆盖了利用散列,也在ArrayList ,它使用索引等的地方。

关于java - 具有重复项的 "containsAll"的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48230146/

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