Es gibt zwei Szenarien, in denen es sinnvoll ist, für eine Hash-Karte, schwach zu sein (Sie scheint den zweiter zu passen):
Man möge mit einer bekannten Identitätsinformationen zu einem Objekt befestigen; Wenn das Objekt aufhört zu existieren, wird die angehängte Information bedeutungslos und sollte ebenfalls aufhören zu existieren. JavaScript unterstützt dieses Szenario.
Man möchte Referenzen auf semantisch identische Objekte zusammenführen, um Speicheranforderungen zu reduzieren und Vergleiche zu beschleunigen. Das Ersetzen vieler Verweise auf identische große Teilbäume, z. B. mit Verweisen auf den gleichen Teilbaum, kann eine Verringerung der Speicherbelegung und Ausführungszeit um Größenordnungen ermöglichen. Leider unterstützt JavaScript dieses Szenario nicht.
In beiden Fällen Verweise in der Tabelle werden am Leben, so lange aufbewahrt, wie sie nützlich sind, und „natürlich“ für die Sammlung geeignet werden, wenn sie unbrauchbar werden. Leider haben die Designer von WeakReference
, statt separate Klassen für die beiden oben definierten Anwendungen zu implementieren, es so gemacht, dass es für beide verwendbar ist, wenn auch nicht besonders gut. In den Fällen, in denen die Schlüssel die Gleichheit für die Referenzidentität definieren, erfüllt WeakHashMap
das erste Verwendungsmuster, aber die zweite wäre bedeutungslos (Code, der einen Verweis auf ein Objekt enthält, das semantisch mit einem gespeicherten Schlüssel identisch ist, würde a enthalten.) Referenz auf den gespeicherten Schlüssel, und würde die WeakHashMap nicht benötigen, um es zu geben). In Fällen, in denen Schlüssel eine andere Form der Gleichheit definieren, ist es im Allgemeinen nicht sinnvoll, dass eine Tabellenabfrage etwas anderes als einen Verweis auf das gespeicherte Objekt zurückgibt, aber die einzige Möglichkeit zu vermeiden, dass der gespeicherte Verweis den Schlüssel am Leben erhält, ist Verwenden Sie einen WeakHashMap<TKey,WeakReference<TKey>>
und lassen Sie den Client die schwache Referenz abrufen, die darin gespeicherte Schlüsselreferenz abrufen und prüfen, ob sie noch gültig ist (sie könnte zwischen der WeakHashMap
die WeakReference
und der WeakReference
selbst überprüft wird).
Ich denke, diese Frage speziell auf JavaScript bezieht, nicht Java oder einer anderen Sprache, die 'WeakReference' /' WeakHashMap' hat. Das Problem ist, dass JavaScript nur eine "WeakHashMap" hat, aber nicht das Äquivalent einer 'WeakReference'. –
@ Qantas94Heavy: In der Tat so. Vielleicht hätte ich angeben sollen, dass JavaScript nur das erste unterstützt, was leider nicht das ist, was das OP wirklich will. Gefällt dir die Bearbeitung? – supercat