1

Java如何快速比较两个集合在java中是否完全相同?

例如:

如果此集合为 Set,则比较它们是否包含相同的对象并且它们的大小是否相同。

代码如下所示

public boolean isSameSets(Set<T> set1, Set<T> set2){

    if (set1.size() != set2.size()) {
        return false;
    }

    return set1.containAll(set2) && set2.containAll(set1);
}

但是如果集合是列表,因为列表是排序集合,我们可以迭代比较每个元素,我认为这种方式不是最好的,请谁能告诉我如何快速比较它们?

==================================================== ======

谢谢大家,其实Collection equals方法可以做到,包括Set和List。

4

4 回答 4

4

Collectionequals(Object)方法应该为您执行此操作。javadoc准确解释了“等于”对于 Collection 的含义,并且针对扩展 Collection 的接口进一步细化了语义。

不同的集合类将有自己的此方法的实现,针对它们各自的语义模型和表示进行调整。例如,equalsa 上的方法List会考虑元素顺序,但equalsa 上的方法Set通常不会。

有人问:

我们不能使用 containsAll(Collection)。

一般来说,没有。例如,具有相同元素的两个列表不一定相等。您还必须考虑列表顺序。(此外,使用containsAll来比较列表是aO(N^2)的有效equals实现List应该是O(N)......在最坏的情况下。)

这同样适用于使用retainsAll.

于 2012-09-29T01:37:37.273 回答
4

HashSet.equals方法已经进行了比较,以确保每组中有完全相同的元素。ArrayList.equals除了它还检查排序之外,它的作用相同。

于 2012-09-29T01:38:41.853 回答
0

您可以使用Collection.retainAll()

于 2012-09-29T01:36:51.350 回答
0

还可以考虑使用 Google Guava 库:

elementsEqual(Iterable, Iterable)    

如果可迭代对象具有相同顺序的相同元素,则返回 true。即使集合是没有预定义顺序的HashSet,但元素个数相同且元素相等,在迭代过程中你会发现两个集合的顺序是相同的,提供了正确的hashCodeequals方法。

于 2013-11-16T09:32:16.220 回答