类和case类中的方法hashCode



我希望这个答案没有重复,我试过搜索,我想以前没有人问过。

从Scala文档中,我可以阅读(https://docs.scala-lang.org/overviews/scala-book/case-classes.html):

...
`equals` and `hashCode` methods are generated, which let you compare objects and easily use them as keys in maps.
...

所以我有这个代码:

class Person_Regular(name: String)
case class Person_CC(name: String)

如果我打印hashCode():的结果

println(Person_CC("a").hashCode()) 

我可以在控制台中看到:

-1531820949

这是有意义的,因为case类默认包含方法hashCode。普通班怎么样?

此代码:

println((new Person_Regular("Joe")).hashCode())

还打印哈希代码:

1018937824

那么,当定义class时,方法hashCode也会自动生成?那么,为什么Scala文档说hashCode是用case类生成的,而常规类已经这样做了呢?

那么在定义类时,方法hashCode也会自动生成吗?

否。对于普通类,它只是从java.lang.Object/AnyRef继承而来,并且它基于对象的标识,而不是其内容:

class A(name: String)
case class B(name: String)
println(A("x").hashCode != A("x").hashCode) // true: hash codes are different
println(B("x").hashCode == B("x").hashCode) // true: hash codes are the same

在第一种情况下,允许散列码不同,因为对象在引用上不相等。

在第二种情况下,散列码是以可预测的方式从case类的内容派生的,因此是相同的。

相关内容

  • 没有找到相关文章

最新更新