2013-03-17 11 views

Antwort

9

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 mit WeakReference 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 mit WeakReference 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 und hashcode übersteuert. Aber das ist höchstwahrscheinlich unbrauchbar.

  • Ich glaube nicht, dass dies durch Überschreiben von Methoden in ConcurrentHashMap oder IdentityHashMap 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.

+0

Alle Kommentare über mögliche Optionen? –

+1

Verwenden Sie Google Guava. Das ist eine Option. (Irgendein Grund, es nicht zu benutzen?) Oder schreiben Sie Ihre eigene Implementierung von Grund auf neu. –

+0

In Bezug auf die Leistung der erforderlichen Karte aus Guava, wird es das gleiche wie 'java.util.concurrent.ConcurrentHashMap' sein? –

1

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.

+0

Das ist richtig - warum wurde es downvoted? Sie sollten erwähnen, dass die Verwendung von schwachen Schlüsseln die Schlüsselgleichheit mit '==' bewertet. –

0

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.

Example of ehcache3

Example I wrote

Pull Rquest to fix the ehcache3 ConcurrentWeakIdentityHashMap Key hashCode

+0

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