Objektreferenz in Java gesetzt

8

Ich muss ein Set von Objekten erstellen. Das Problem ist, dass ich das Hashing oder die Gleichheit nicht auf den HashCode der Objekte gründen möchte und die Implementierung gleich ist. Stattdessen möchte ich, dass der Hashcode und die Gleichheit nur auf der Referenzidentität jedes Objekts basieren (d. H. Dem Wert des Referenzzeigers).

Ich bin nicht sicher, wie man das in Java macht.

Der Grund dafür ist, dass meine Objekte nicht zuverlässig equals oder hashCode implementieren, und in diesem Fall ist die Referenzidentität gut genug.

    
Landon Kuhn 29.04.2010, 14:43
quelle

3 Antworten

19

Ich denke, java.util.IdentityHashMap ist, was du bist auf der Suche nach (Hinweis, es gibt keine IdentityHashSet ). Suchen Sie in der API-Dokumentation nach:

  

Diese Klasse implementiert die Schnittstelle Map mit einer Hashtabelle, wobei beim Vergleichen von Schlüsseln (und Werten) die Gleichheit der Objekte anstelle der Objektgleichheit verwendet wird. Mit anderen Worten, in einem IdentityHashMap werden zwei Schlüssel k1 und k2 genau dann als gleich betrachtet, wenn (k1==k2) . (In normalen Map Implementierungen (wie HashMap ) werden die beiden Schlüssel k1 und k2 genau dann als gleich betrachtet, wenn (k1==null ? k2==null : k1.equals(k2)) .)

     

Diese Klasse ist keine universelle Map Implementierung! Während diese Klasse die Schnittstelle Map implementiert, verletzt sie absichtlich den allgemeinen Vertrag von Map , der beim Vergleich von Objekten die Verwendung der Methode equals vorschreibt. Diese Klasse ist nur für die Verwendung in den seltenen Fällen vorgesehen, in denen Semantik für die Referenzgleichheit erforderlich ist.

Bearbeiten : Siehe unten Joachim Sauers Kommentar, es ist wirklich einfach, ein Set basierend auf einem bestimmten Map zu erstellen. Sie müssten so etwas tun:

%Vor%     
Jesper 29.04.2010, 14:46
quelle
3

Sie könnten Ihre Objekte in eine Wrapperklasse einschließen, die dann hashcode und equals basierend auf der Identität des Objekts implementieren könnte.

    
Carl Smotricz 29.04.2010 14:48
quelle
1

Sie können HashSet (oder tatsächlich - AbstractSet ) erweitern und mit IdentityHashMap , die System.identityHashCode(object) anstelle von obj.hashCode() .

Sie können einfach nach IdentityHashSet googlen, es gibt bereits einige Implementierungen. Oder verwenden Sie Collections.newSetFromMap(..) wie von Joachim Sauer vorgeschlagen.

Dies sollte natürlich nur geschehen, wenn Sie nicht im Besitz der Klassen Ihrer Objekte sind. Ansonsten fixiere einfach ihre hashCode()

    
Bozho 29.04.2010 14:45
quelle

Tags und Links