如何有效地比较集? [重复](How to efficiently compare Sets?

2019-07-03 19:21发布

这个问题已经在这里有一个答案:

  • 什么是Java比较两组最快的方法是什么? 9个回答

鉴于两类:如何将它们有效地在Java中比较?

  • (一)保持他们的List S,对它们进行排序和比较。 ( Comparable
  • (二)让他们为Set S和比较hashCode子集的?

背景:

许多比较需要做集是小的(通常<每套5种元素)。

Answer 1:

比较两组正确的方法是使用了equals方法 。 我不会担心性能降低,除非你已经证明,这是你的代码是导致性能问题(我怀疑)的一部分。 并考虑您的套(5元)的大小,这将是非常快的(可能是亚毫秒)。

让他们的名单,对它们进行排序和比较。 (可比)

肯定会慢一些,你将需要复制的元素,对它们进行排序和比较。

让他们为集合和比较集的哈希码?

如果2台是相等的(具有相同的内容),他们将具有相同的散列码。 倒数是不是真的:2套不同的内容可能具有相同的哈希码。 还要注意,对于HashSet例如哈希码是通过在中所有元素,所以它不是一个免费的操作来计算。



Answer 2:

这有什么错等号 ? 该文档指出,如果都是相同的大小,如果返回true containsAll()返回true,听起来很有效的给我。

在任何情况下,你永远不应该比较的哈希码测试相等,两个不同的对象可能具有相同的哈希码。

更新:如在评论中所指出(在assylias'回答)的哈希码可以用作平等测试逻辑的一部分(不同散列码意味着不同的对象-但不是相反)。 以上我的话意味着单独的哈希码是不是(一般)就够了。



Answer 3:

如果你有两个HashSet S,通过比较它们Set.equals会为O(n),因为只有一组需要通过迭代,和其他将被检查的contains ,它本身就是O(1)。

需要注意的是换套小你的O(n)和O(N 2)是忽略不计,所以即使是naïvest方法将产生良好的性能之间的差异。



Answer 4:

假设你想要做一个比较是否set1具有完全相同的同一元素set2

set1.equals(set2)set2.equals(set1)以确保两个是完全一样的



文章来源: How to efficiently compare Sets? [duplicate]