WeakHashMap ist nicht nützlich als Cache, zumindest die Art, wie die meisten Leute darüber denken. Wie Sie sagen, es verwendet schwach Schlüssel, nicht schwach Werte, so ist es nicht für das, was die meisten Menschen es für verwenden wollen (und in der Tat habe ich gesehen Menschen verwenden es für, falsch).
WeakHashMap ist hauptsächlich nützlich, um Metadaten über Objekte zu behalten, deren Lebenszyklus Sie nicht kontrollieren. Zum Beispiel, wenn Sie eine Menge Objekte durch Ihre Klasse passieren lassen und Sie zusätzliche Daten über sie verfolgen möchten, ohne dass Sie benachrichtigt werden müssen, wenn sie den Bereich verlassen, und ohne dass Sie sich darauf beziehen, um sie am Leben zu erhalten.
Ein einfaches Beispiel (und ein Ich habe, bevor sie verwendet) könnten sein, so etwas wie:
WeakHashMap<Thread, SomeMetaData>
wo Sie den Überblick von dem, was in Ihrem System verschiedene Fäden halten könnten tun; Wenn der Thread abstirbt, wird der Eintrag automatisch aus der Map entfernt und der Thread wird nicht mehr als Garbage Collection behandelt, wenn Sie der letzte Hinweis darauf sind. Sie können dann über die Einträge in dieser Map iterieren, um herauszufinden, welche Metadaten Sie über aktive Threads in Ihrem System haben.
Weitere Informationen finden Sie unter WeakHashMap in not a cache!.
Für den Cache-Typ, den Sie suchen, verwenden Sie entweder ein dediziertes Cache-System (z. B. EHCache) oder sehen Sie sich google-collections' an. MapMaker class; so etwas wie
new MapMaker().weakValues().makeMap();
wird tun, was Sie nach, oder wenn Sie Lust bekommen möchten, können Sie zeitlich Ablauf hinzufügen:
new MapMaker().weakValues().expiration(5, TimeUnit.MINUTES).makeMap();
Java API voll von seltsamen Macken ist. Sie können WeakHashMap immer mit WeakReference neu schreiben. – Pacerier