Java [HashCode] Ungereimtheiten in Bezug auf die HashCode Methode

T

Tersus

Gast
Grüßt euch,

mir ist bewusst, dass gleiche (im Sinne von equals()) Objekte unbedingt den selben HashCode haben sollten bzw. haben müssen und dass Objekte mit selben HashCode nicht gleich sein müssen.

Objekte mit selbigem HashCode landen im selben Bucket, der/die/das möglichst wenig Elemente beinhalten sollte, da innerhalb dieses Buckets die Objekte langsam mittels equals() verglichen werden, um das richtige Objekt zu finden.
Am besten also ein eindeutiger HashCode. Das ist mir soweit klar wie ein Kristall sein sollte.

Nun zu meiner Frage:

In einer Datenbank hat jede Entität eine eindeutige ID. Ich nehme mal beispielhaft die Entität Tier.
Als Klasse mit folgenden spontanen Attributen:
Code:
Tier(long _id_, String name, byte anzahlBeine, String felldichte, Art art, ... )
Wenn ich also im Programm mit Objekten vom Typ "Tier" arbeite, die aus der Datenbank kommen, dann gilt die Regel, dass Instanzen mit selbiger id gleich sein sollen, auch wenn die restlichen Attribute nicht überein stimmen.

Reicht es in diesem Fall, die HashCode-Methode wie folgt zu überschreiben?
Code:
@Override
public int hashCode() {
    return (int) this.id;
}

Meine Motivation ist folgende. Wenn ich eine HashMap erstelle, in der ich z.B. jedem Tier eine Menge von Pflegern zu ordnen möchte, dann kann ich mir die Menge der Pfleger lediglich über die id des Tieren geben lassen, ohne den Rest vom Tier zu kennen.

Pseudo-Darstellung
HashMap: Tier --> Menge von Pflegern

Ich kann mir so recht schnell die Pfleger geben lassen, in dem ich ein neues Tier erzeuge, welches lediglich eine id hat.

Etwas konkreter:
Mein guter Hund Hasso hat die id = 4. Mehr weiß ich von ihm nicht. Wenn ich nun seine Pfleger finden möchte, dann mache ich folgendes:
Code:
// gegeben
Map<Tier, Set<Pfleger>> hashMap = new HashMap<>();

// Jedem konkreten Tier werden Pfleger zugeordnet 
...

// Ich weiß von meinem Hund, dessen Pfleger ich suche, nur noch die id

Set<Pfleger> pflegerVonHasso = hashMap.get(new Tier(4l));

Auch noch mal zur equals-Methode. Würde ich hier Gleichheit in Bezug auf alle Attribute beziehen, würde dieser code natürlich nicht funktionieren.
 
Prinzipiell ist es deine Sache, wie feingranular du hashcode und equals implementierst, solange du diverse Dinge einhälst (equals muss z.b. reflexiv, symmetrisch und transitiv sein, was es aber sowieso wäre, wenn du nur ids vergleichst. Die anderen Dinge hast du ja bereits ganz oben erwähnt). Wenn für dich zwei Tiere gleich sind, sobald sie die gleiche id haben, dann sei das eben so.

Aber: du verlierst die Möglichkeit, zwei Tiere "komplett" miteinander zu vergleichen, nur um die Hashmap einfacher benutzen zu können. Wenn du Tiere und ihre Pfleger in einer Map nur über die id abbilden willst, dann solltest du auch nur die id als Key für die Map nehmen, dafür ist die id ja da.
 
Zuletzt bearbeitet:
Was spricht dagegen der Klasse Tier einfach ein Attribut ArrayList<Pfleger> pfleger zu verpassen?
Oder nimm wie schon gesagt die id als key für die hashmap und nicht das komplette Tier.
 
Gute Antworten bzw. Einwände.

Problem, mehr oder weniger, ist, dass diese Java Map per externem XML Mapper auf eine xml gemappt wird. Da müssen alle Informationen drin stehen. Würde ich in der Map nur die ID verwenden, stünde in der ausgeworfenen xml datei auch nur die id des Tieres drin. Andernfalls hätte ich es so gehandhabt, wie von euch vorgeschlagen.
 
Zurück
Oben