hashCode()

code404

Aktives Mitglied
Hallo zusammen,

ich habe eine Frage zu hashCode()
Wenn ich eine Klasse habe die als Member zwei weiter Klassen beinhaltet.
Die Klasse soll den gleichen Hashcode zurückgeben wenn die zwei Member gleich sind.
Wie schreibe ich dann die hashCode-Funktion?
Also:
Java:
 public class AB
	    {
	    	private A a;
	    	private B b;
	    	@Override
	    	public int hashCode()
	    	{
	    		int aHashCode = a.hashCode();
	    		int bHashCode = b.hashCode();
	    		return ...
	    	}
	    }
Was mache ich jetzt am Besten mit den zwei Hashwerten meiner Member?
Addieren, irgendwie verschieben? Ich will ja nicht das der Int-Wert mal überläuft.
Wie kann ich sichergehen das es den errechnet Hashwert nicht bereits schon gibt?

Besten Dank
 

Marco13

Top Contributor
Das ist wurscht :)

Du könntest auch
Code:
public int hashCode() { return 0; }
schreiben, und das wäre formal in Ordnung (nicht gut, aber formal richtig). Überläufe spielen auch keine Rolle. Es gibt nur die eine Formale Anforderung an hashCode: Wenn zwei Objekte "equals" sind, dann müssen sie die gleichen hashCodes liefern. (Umgekehrt gilt das nicht: Zwei Objekte, die den gleichen hashCode liefern, KÖNNEN trotzdem nicht-equals sein). Allerdings sollte man, damit HashTables usw. gut funktionieren, versuchen, den hashCode möglichst eindeutig zu machen. In diesem Fall würde ein einfaches addieren oder XOR schon reichen, aber das "Effective Java"-hashCode-Muster würde in diesem Fall so aussehen
Code:
            public int hashCode()
            {
                int aHashCode = a.hashCode();
                int bHashCode = b.hashCode();
                return 37 * aHashCode + bHashCode;
            }
(mit einer Primzahl multiplizieren und den anderen aufaddieren). Beachte, dass du ggf. noch auf a==null und b==null testen mußt.
 

musiKk

Top Contributor
Wenn Du Eclipse verwendest, kannst Du auf einen Code-Generator für hashCode() und equals() zurückgreifen. Der erzeugt das von Marco13 erwähnte Schema.
 

Ähnliche Java Themen

Neue Themen


Oben