或者Scala是否使用独立于其元素的内容来计算元组哈希码,例如内存地址?
换句话说,给定两个Tuple2
s (a, b)
和(c, d)
,a == c && b == d
是否意味着(a, b).hashCode == (c, d).hashCode
?
答案 0 :(得分:7)
a == c
&&b == d
暗示(a, b).hashCode == (c, d).hashCode
?
是的,确实如此。这是==
和hashCode
之间的合同。 (*)
Scala元组类型是否使用其所有元素来计算其哈希码?
是的,确实如此。 Scala Tuple2
只是一个案例类:
final case class Tuple2[@specialized(Int, Long, Double, Char, Boolean/*, AnyRef*/) +T1, @specialized(Int, Long, Double, Char, Boolean/*, AnyRef*/) +T2](_1: T1, _2: T2)
extends Product2[T1, T2]
{
...
}
在Scala hashCode
中,案例类的计算方法如下:
hashCode in case classes in Scala
What code is generated for an equals/hashCode method of a case class?
(*)从以下可以看出,对于案例类(包括元组),合同得以实现。
答案 1 :(得分:3)
Scala元组(以及相关案例类)根据所有内容实现hashCode
和==
,而不是其他内容。
是的,a == c && b == d
隐含(a, b).hashCode == (c, d).hashCode
,假设hashCode
,a
,b
和{{1}的c
方法也很乖。