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.
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 einemIdentityHashMap
werden zwei Schlüsselk1
undk2
genau dann als gleich betrachtet, wenn(k1==k2)
. (In normalenMap
Implementierungen (wieHashMap
) werden die beiden Schlüsselk1
undk2
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 SchnittstelleMap
implementiert, verletzt sie absichtlich den allgemeinen Vertrag vonMap
, der beim Vergleich von Objekten die Verwendung der Methodeequals
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:
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.
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()
Tags und Links java collections