Java中ContainsAll的成本是多少?

时间:2012-04-17 21:55:22

标签: java arrays list interface

我今天在一些编码过程中发现了containsAll()(一种List接口方法),它看起来很漂亮。有谁知道这在性能/迭代方面的成本是多少?

documentation并未提供太多内容。

4 个答案:

答案 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)
  • 对于ArrayListcontains将取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))算法