这个问题已经在这里有一个答案:
- 什么是Java比较两组最快的方法是什么? 9个回答
鉴于两类:如何将它们有效地在Java中比较?
- (一)保持他们的
List
S,对它们进行排序和比较。 (Comparable
) - (二)让他们为
Set
S和比较hashCode
子集的?
背景:
许多比较需要做集是小的(通常<每套5种元素)。
这个问题已经在这里有一个答案:
鉴于两类:如何将它们有效地在Java中比较?
List
S,对它们进行排序和比较。 ( Comparable
) Set
S和比较hashCode
子集的? 背景:
许多比较需要做集是小的(通常<每套5种元素)。
比较两组正确的方法是使用了equals
方法 。 我不会担心性能降低,除非你已经证明,这是你的代码是导致性能问题(我怀疑)的一部分。 并考虑您的套(5元)的大小,这将是非常快的(可能是亚毫秒)。
让他们的名单,对它们进行排序和比较。 (可比)
肯定会慢一些,你将需要复制的元素,对它们进行排序和比较。
让他们为集合和比较集的哈希码?
如果2台是相等的(具有相同的内容),他们将具有相同的散列码。 倒数是不是真的:2套不同的内容可能具有相同的哈希码。 还要注意,对于HashSet
例如哈希码是通过在中所有元素,所以它不是一个免费的操作来计算。
这有什么错等号 ? 该文档指出,如果都是相同的大小,如果返回true containsAll()
返回true,听起来很有效的给我。
在任何情况下,你永远不应该比较的哈希码测试相等,两个不同的对象可能具有相同的哈希码。
更新:如在评论中所指出(在assylias'回答)的哈希码可以用作平等测试逻辑的一部分(不同散列码意味着不同的对象-但不是相反)。 以上我的话意味着单独的哈希码是不是(一般)就够了。
如果你有两个HashSet
S,通过比较它们Set.equals
会为O(n),因为只有一组需要通过迭代,和其他将被检查的contains
,它本身就是O(1)。
需要注意的是换套小你的O(n)和O(N 2)是忽略不计,所以即使是naïvest方法将产生良好的性能之间的差异。
假设你想要做一个比较是否set1
具有完全相同的同一元素set2
。
set1.equals(set2)
也set2.equals(set1)
以确保两个是完全一样的 。