Scala元组类型是否使用其所有元素来计算其哈希码?

时间:2017-09-19 17:56:01

标签: scala

或者Scala是否使用独立于其元素的内容来计算元组哈希码,例如内存地址?

换句话说,给定两个Tuple2 s (a, b)(c, d)a == c && b == d是否意味着(a, b).hashCode == (c, d).hashCode

2 个答案:

答案 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,假设hashCodeab和{{1}的c方法也很乖。