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(..)
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
来说,这可能是O(1)(最好的情况是没有冲突),因此HashMap
的总体运行时间仍然是O(n)containsAll
- 对于
,ArrayList
将取O(m),其中m是列表中的数字项(不是参数),因此contains
的总时间将为O(n*m)containsAll
- 考虑
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有类似的功能——我下次会考虑使用它。