假设我们在Scala中有三组字符串。一个有元素A,B,C。两个具有元素B,C,D。三个有元素J,K,I。
我的第一个问题是,是否有任何方法可以使这两组中的任何两个的哈希码相同? 我的第二个问题是,如果我将D添加到One和A到Two以获得新的Set One.n和Two.n,那么One.n和Two.n的哈希码是否相同?
答案 0 :(得分:6)
问题1)总的来说是的,完全可能。哈希码的长度有限。套装可以是任何尺寸。所以哈希码不能是唯一的(尽管通常都是)。
问题2)为什么不试试呢?
scala> val One = collection.mutable.Set[String]("A", "B", "C")
One: scala.collection.mutable.Set[String] = Set(A, B, C)
scala> One.hashCode
res3: Int = 1491157345
scala> val Two = collection.mutable.Set[String]("B", "C", "D")
Two: scala.collection.mutable.Set[String] = Set(B, D, C)
scala> Two.hashCode
res4: Int = -967442916
scala> One += "D"
res5: One.type = Set(A, B, D, C)
scala> Two += "A"
res6: Two.type = Set(B, D, A, C)
scala> One.hashCode
res7: Int = -232075924
scala> Two.hashCode
res8: Int = -232075924
所以,是的,正如您所料,它们是正确的,因为您希望这两个实例的==
方法为真。
答案 1 :(得分:2)
设置相同且内部没有任何奇怪的设置(即任何具有不稳定哈希码的内容,或哈希码与equals不一致的内容)应该具有相同的哈希码。如果不是这样,并且集合是相同类型的集合,则它是一个错误,应该报告。如果集合是不同类型的集合,则可能存在或不存在具有不同哈希码的错误(但无论如何它应该与equals一致)。我不知道任何不同的set实现不相等的情况(例如,甚至可变的BitSet与不可变的Set一致)。
所以: