Java中ContainesAll的成本是多少?

Java中ContainesAll的成本是多少?,java,arrays,list,interface,Java,Arrays,List,Interface,在今天的一些编码过程中,我发现了containsAll()(一种列表接口方法),它看起来非常流畅。有人知道这在性能/迭代方面要花多少钱吗 该公司在这方面没有提供太多的服务。 首先,它迭代所提供集合的每个元素 然后它迭代列表中的所有元素,并使用.equals(..)将当前元素与它们进行比较(注意:这是关于列表的,正如您在问题中指定的。其他集合的行为不同) 这就是O(n*m),其中n和m是两个集合的大小 public boolean containsAll(Collection<?>

在今天的一些编码过程中,我发现了
containsAll()
(一种
列表
接口方法),它看起来非常流畅。有人知道这在性能/迭代方面要花多少钱吗

该公司在这方面没有提供太多的服务。

  • 首先,它迭代所提供集合的每个元素
  • 然后它迭代列表中的所有元素,并使用
    .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;
}
public boolean containsAll(集合c){
迭代器e=c.迭代器();
while(e.hasNext())
如果(!包含(如next())
返回false;
返回true;
}
使用源代码,Luke:)

编辑:正如Bozho指出的,您询问的是覆盖
Collection.containsAll()
List.containsAll()
。以下漫谈主要涉及后者:

大多数
集合
类都将使用,它是这样做的:

public boolean containsAll(Collection<?> c) {
    for (Object e : c)
        if (!contains(e))
            return false;
    return true;
}
public boolean containsAll(集合c){
用于(对象e:c)
如果(!包含(e))
返回false;
返回true;
}
但是,不能保证某些实现会以完全不同的方式执行,这可能会导致更好或更差的运行时行为

containsAll
的上述实现将至少为O(n),其中n是您传入的
集合
参数中的项数,加上
包含
的时间:

  • 对于
    HashSet
    /
    HashMap
    来说,这可能是O(1)(最好的情况是没有冲突),因此
    containsAll
    的总体运行时间仍然是O(n)
  • 对于
    ArrayList
    contains
    将取O(m),其中m是列表中的数字项(不是参数),因此
    containsAll
    的总时间将为O(n*m)
    • 考虑

      n、 康纳索尔(米)

      最好的情况是O(m),如果n是一个完美的散列集


      考虑到未排序的列表,如果您调用A.containsAll(B),我可以提出一个O(n*log(n)+m*log(m))算法

      openjdk迭代调用A.contains(B)的B的所有元素

      A.contains(b)迭代调用A.equals(b)的所有元素


      这是来源于

      Um,这是
      addAll
      实现,而不是
      containsAll
      。但是OP:对于大多数实现,
      包含所有成本
      O(n^2)
      ;它没有做任何特别酷的事情。@LouisWasserman Oops,复制粘贴了错误的代码块。修正。澄清一下:这适用于大多数
      列表
      实现
      containsAll
      通常需要
      O(n)
      乘以
      contains
      查询的成本。不过,特定的集合类可能会覆盖
      contains()
      以提供更好的实现。思考
      HashSet
      。同意。我没有费心研究AbstractCollection的每个实现。您的第二个要点假设
      contains()
      ,但是
      HashSet
      /
      HashMap
      在O(1)中执行,任何排序的集合都可能在O(logn)中执行。@PhilippReichart我知道这一点,但问题涉及listsOh,对吗。我的思绪转移到了
      Collection.containsAll()
      的原始定义上,它被
      List.containsAll()
      覆盖。事实上,它不是。我复制的代码片段来自AbstractCollection。我添加了关于不同集合(地图、集合)的注释。但当他提到清单时,我会继续关注它,我也这么怀疑。谢谢我很高兴你提到HashMap有类似的功能——我下次会考虑使用它。