我今天在一些编码过程中发现了containsAll()
(一种List
接口方法),它看起来很漂亮。有谁知道这在性能/迭代方面的成本是多少?
documentation并未提供太多内容。
答案 0 :(得分:2)
.equals(..)
将当前元素与它们进行比较(注意:这是关于列表,正如您在问题中指定的那样。其他集合表现不同)所以它是O(n * m),其中n和m是两个集合的大小。
public boolean containsAll(Collection<?> c) {
Iterator<?> e = c.iterator();
while (e.hasNext())
if (!contains(e.next()))
return false;
return true;
}
答案 1 :(得分:1)
使用来源,卢克:)
编辑:正如Bozho指出的那样,你问List.containsAll()
哪个覆盖Collection.containsAll()
。以下的谣言主要涉及后者:
大多数Collection
课程都会使用implementation of containsAll
from AbstractCollection
,就像这样:
public boolean containsAll(Collection<?> c) {
for (Object e : c)
if (!contains(e))
return false;
return true;
}
但是不能保证某些实现完全不同,这可能导致更好或更差的运行时行为。
containsAll
的上述实现至少为O(n),其中n是您传入的 Collection
参数中的项目数,加上 contains
所需的任何时间:
HashSet
/ HashMap
,这可能是O(1)(最好的情况,没有冲突),因此containsAll
的整体运行时仍然是O(n)ArrayList
,contains
将取O(m),其中m是列表中的数字项(不是参数),因此containsAll
的总时间将为O (N * M)答案 2 :(得分:1)
如果你打电话给A.containsAll(B)
openjdk迭代B调用A.contains(b)的所有元素。
A.contains(b)迭代A的所有元素,调用a.equals(b)
这取自open jdk 7
的来源答案 3 :(得分:0)
考虑
n.ContainsAll(M)
最好的情况是O(m),如果n是完美的哈希集,那就是。
考虑未排序的列表,我可以想出一个O(n * log(n)+ m * log(m))算法