Montag, 9. August 2010

Javas equals() und hashCode() Methoden

Die von der Basisklasse Object realisierte Implementierung von eineInstanz.equals() macht folgendes:

x.equals(y){ return this==y;}

Die Eigenschaften von .equals() sollen die Äquivalenzrelation erfüllen und pro Programmlauf konsistent sein, indem Sinne, dass bei Konstanz der für die Evaluierung der Äquivalenz herangezogenen Parameter des Objekts auch der Rückgabewert von .equals() gleich bleibt.

Die Methode .hashCode() soll bei Auswertung von .equals()==true auf den beteiligten Objekten auch den gleichen Hashwert zur Folge haben. Umgehrt bedeutet das, daß bei unterschiedlichen Hashwerten das Ergebnis von .equals() auf den beteiligten Objekten den Wert false haben muß.

Aber das heißt nicht, dass Objekte, für die .equals() auf false hinausläuft einen unterschiedlichen Hashwert haben müssen. Es wird nur zwecks Performanz von Hash-Implementierungen in Java-System-Klassen empfohlen einen unterschiedlichen Haswert zu erzeugen.

Also zusammengefasst in Pseucode:

Von .equals() ausgehend:
switch(x.equals(y)):{
case true:
  ( x.hashCode()==y.hashCode() ) == true
case false:
  ( x.hashCode()==y.hashCode() || x.hashCode()!=y.hashCode() [letzteres wird empfohlen]) == true
}

Von .hashCode() ausgehend:
switch(x.hashCode()==y.hashCode()){
case true:
  ( x.equals(y) || !(x.equals(y) ) == true
case false:
  (x.equals(y) == false) == true
} 

Also ist x.equals(y) == true hinreichend (aber nicht notwendig) für x.hashCode()==y.hashCode()==true und x.hashCode()==y.hashCode()==false hinreichend (aber nicht notwendig) für x.equals(y)==false.

Keine Kommentare:

Kommentar veröffentlichen