Ausgabe
Ich hoffe, diese Antwort wird nicht dupliziert, ich habe versucht zu suchen und ich glaube, sie wurde vorher nicht gefragt.
Aus der Scala-Dokumentation kann ich lesen ( 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.
...
Also ich habe diesen Code:
class Person_Regular(name: String)
case class Person_CC(name: String)
Wenn ich das Ergebnis drucke hashCode()
:
println(Person_CC("a").hashCode())
Ich sehe in der Konsole:
-1531820949
Dies ist sinnvoll, da die Fallklasse hashCode
standardmäßig die Methode enthält. Wie wäre es mit einer regulären Klasse?
Dieser Code:
println((new Person_Regular("Joe")).hashCode())
Gibt auch den Hashcode aus:
1018937824
Also wird beim Definieren einer automatisch auch class
die Methode generiert? hashCode
Warum sagt dann die Scala-Dokumentation, dass das hashCode
mit Fallklassen generiert wird, wenn reguläre Klassen dies bereits tun?
Lösung
Also wird beim Definieren einer Klasse automatisch auch die Methode hashCode generiert?
java.lang.Object
Nein. Für gewöhnliche Klassen wird es nur von / geerbt AnyRef
und basiert auf der Identität des Objekts, nicht auf seinem Inhalt:
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
Im ersten Fall dürfen sich die Hashcodes unterscheiden, da die Objekte nicht referentiell gleich sind.
Im zweiten Fall werden die Hash-Codes auf vorhersagbare Weise aus den Inhalten der Fallklasse abgeleitet und sind daher gleich.
Beantwortet von – Andrey Tyukin
Antwort geprüft von – David Goodson (FixError Volunteer)