如何有效地比较集?

时间:2012-11-13 12:21:58

标签: java set comparable

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

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

背景

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

4 个答案:

答案 0 :(得分:9)

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

  

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

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

  

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

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

假设您要进行比较,set1是否set2完全相同的元素。

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

答案 3 :(得分:0)

如果您有两个HashSet,则按Set.equals进行比较将为O(n),因为只需要迭代一个集合,另一个集合将由contains进行检查,本身就是O(1)。

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