Wie bekomme ich eine ConcurrentHashMap
mit schwachen Schlüsseln und Identitätshashes in Java? Ich denke Google Guava Collections kann so etwas geben, aber kann ich es aus der Standardbibliothek bekommen? Welche anderen Optionen habe ich?ConcurrentHashMap mit schwachen Schlüsseln und Identitätshash?
Antwort
Ich denke Google Guava Collections kann so etwas geben, aber kann ich es aus der Standardbibliothek bekommen?
Die kurze Antwort darauf ist Nein. Java SE implementiert diese bestimmte Kombination nicht.
Sie konnten
java.util.concurrent.ConcurrentHashMap
mitWeakReference
Schlüssel, instanziiert und einige zusätzliche Arbeit tun Entfernung von Karteneinträge für fehlerhafte Verweise zu implementieren, aber das wird nicht Sie Identität Hash-Semantik geben.Sie könnten eine
java.util.IdentityHashMap
mitWeakReference
Schlüsseln instanziieren, und einige zusätzliche Arbeit ausführen, um das Entfernen von Zuordnungseinträgen für fehlerhafte Referenzen zu implementieren, aber das wird Ihnen nicht gleichzeitiges Verhalten geben.Die Verwendung einer
java.util.WeakHashMap
gibt Ihnen weder Nebenläufigkeit noch Identität Hashing.Sie könnten (in der Theorie) die Schlüsselklasse in etwas einwickeln, das die natürlichen Methoden
equals
undhashcode
übersteuert. Aber das ist höchstwahrscheinlich unbrauchbar.Ich glaube nicht, dass dies durch Überschreiben von Methoden in
ConcurrentHashMap
oderIdentityHashMap
möglich wäre.
Vielleicht die einzig gangbare Option würde die wichtigsten Klassen equals
und hashcode
Methoden Veränderung Identität basiert. Aber das funktioniert nicht für "eingebaute" Schlüsseltypen (speziell final
) oder für Fälle, in denen Sie in anderen Teilen der Anwendung einen wertorientierten equals/hashcode benötigen.
Die Google Guava-Implementierung scheint der einfachste Weg zu sein. Man kann die erforderliche Karte mit new MapMaker().weakKeys().makeMap()
initialisieren und genauso verwenden, wie man java.util.concurrent.ConcurrentHashMap
verwenden würde. Weitere Informationen finden Sie unter apidoc.
Das ist richtig - warum wurde es downvoted? Sie sollten erwähnen, dass die Verwendung von schwachen Schlüsseln die Schlüsselgleichheit mit '==' bewertet. –
Suche ConcurrentWeakIdentityHashMap, erhalten Sie viele Beispiele. Ich habe selbst ein Tool geschrieben, weil ich denke, dass der Hash-Code von org/ehcache/core/internal/util/ConcurrentWeakIdentityHashMap $ WeakReference so schlecht ist.
Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode
Danke für den zweiten Link. Es löst viele meiner Probleme. Funktioniert wie ein Zauber in meinem AI-Projekt. Musste den Klassenumfang und die Konstruktoren jedoch öffentlich machen – Tschallacka
Alle Kommentare über mögliche Optionen? –
Verwenden Sie Google Guava. Das ist eine Option. (Irgendein Grund, es nicht zu benutzen?) Oder schreiben Sie Ihre eigene Implementierung von Grund auf neu. –
In Bezug auf die Leistung der erforderlichen Karte aus Guava, wird es das gleiche wie 'java.util.concurrent.ConcurrentHashMap' sein? –