我希望这个答案没有重复,我试过搜索,我想以前没有人问过。
从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类的内容派生的,因此是相同的。