给出两个集合:如何在Java中有效地比较它们?
List
,对它们进行排序并进行比较。 (Comparable
)Set
并比较套件的hashCode
?背景
需要进行许多比较 集很小(通常每组<5个元素)。
答案 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 )之间的差异可以忽略不计,因此即使是简单的方法也会产生良好的性能。