如何有效地比较集合?
给出两个集合:如何在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)
确保两者完全相同 。