[FIXED] Methode hashCode in Klassen und Fallklassen

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 hashCodestandardmäß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 classdie Methode generiert? hashCodeWarum sagt dann die Scala-Dokumentation, dass das hashCodemit 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.ObjectNein. Für gewöhnliche Klassen wird es nur von / geerbt AnyRefund 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)

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like