如何有效地比较集合?

给出两个集合:如何在Java中有效地比较它们?

  • (a)将它们保存为List ,对它们进行排序并进行比较。 ( Comparable
  • (b)将它们保存为Set并比较集合的hashCode

背景:

需要进行许多比较集很小(通常每组<5个元素)。

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

将它们保存为列表,对它们进行排序并进行比较。 (可比)

肯定会慢,因为你需要复制元素,对它们进行排序和比较。

将它们保存为集合并比较集合的哈希码?

如果2个集合相等(具有相同的内容),则它们将具有相同的哈希码。 倒数不是真的:具有不同内容的2个集合可以具有相同的散列码。 另请注意,对于HashSet ,例如,通过迭代所有元素来计算哈希码,因此它不是自由操作。

平等有什么问题? 文档声明如果两者具有相同的大小并且如果containsAll()返回true则返回true,对我来说听起来非常有效。

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

更新:如评论中所述(以及在assylias的回答中),哈希码可以用作相等测试逻辑的一部分(不同的哈希码意味着不同的对象 – 但不是相反的)。 我上面的评论意味着单独的哈希码(通常)不够。

如果你有两个HashSet ,用Set.equals比较它们将是O(n)因为只需要迭代一个集合,而另一个集合将由contains检查,它本身就是O(1)。

请注意,对于与您一样小的集合,O(n)和O(n 2 )之间的差异可以忽略不计,因此即使是简单的方法也会产生良好的性能。

假设您想要比较set1是否具有与set2 完全相同的元素。

set1.equals(set2)set2.equals(set1)确保两者完全相同