Warum existiert WeakHashMap, aber kein WeakSet?

Lesezeit: 2 Minuten

Benutzer-Avatar
Stan Kurilin

Aus J. Bloch

Eine … Quelle von Speicherlecks sind Zuhörer … Der beste Weg, um sicherzustellen, dass Rückrufe umgehend von der Garbage Collection erfasst werden, besteht darin, nur schwache Referenzen auf sie zu speichern, indem Sie sie beispielsweise nur als Schlüssel in a speichern
Schwache HashMap.

Also, warum gibt es kein WeakSet in Java Sammlungsrahmen?

  • Stas, können Sie die positiv bewertete, richtige Antwort von Martin anstelle von Martins negativ bewerteter, falscher Antwort akzeptieren?

    – Werkzeugfälscher

    18. Dezember 2017 um 17:55 Uhr


  • Während Joshua Bloch viele vernünftige Ratschläge für Java-Programmierer geschrieben hat, scheint dies eine schreckliche Ausnahme zu sein. Listener in a speichern WeakHashMap stellt niemals „sicher, dass Rückrufe umgehend von der Garbage Collection erfasst werden“, sondern macht sie schrecklich nicht deterministisch. Der Garbage Collector wird nur ausgeführt, wenn nicht genügend Speicher vorhanden ist, daher können solche schwachen Listener beliebig lange herumhängen und immer noch hingerichtetaber noch schlimmer, solche Zuhörer könnten fälschlicherweise verschwinden, wenn Sie sie noch brauchen, da es jetzt eine eigentlich unabhängige starke Referenz braucht, um sie am Leben zu erhalten.

    – Holger

    25. Juni 2019 um 17:22 Uhr


Benutzer-Avatar
Markt

Collections.newSetFromMap

Set<Object> weakHashSet = 
    Collections.newSetFromMap(
        new WeakHashMap<Object, Boolean>()
    );

Wie in … gesehen Collections.newSetFromMap Dokumentation, Bestehen a WeakHashMap ein bekommen Set.

  • tatsächlich enthält jedes Set in der Java-Sammlung Map zum Speichern.

    – Markt

    31. Oktober 2010 um 11:49 Uhr

  • Ja, aber warum gibt es für solche Sachen keine spezielle Klasse?

    – Stan Kurilin

    31. Oktober 2010 um 11:52 Uhr

  • Es ist leicht vorstellbar, warum die Betreuer von java.util möglicherweise aufhören wollten, duale Map- und Set-Versionen von allem, was sie tun, bereitzustellen, und sich dafür entschieden haben, stattdessen nur newSetFromMap() bereitzustellen … nicht wahr?

    – Kevin Bourrillion

    31. Oktober 2010 um 15:48 Uhr

  • Es ist erwähnenswert, dass Collections#newSetFromMap in Android vor API 9 fehlt. Es ist zwar nicht schwierig, eine Implementierung zu finden, die Sie in Ihre App kompilieren können, aber es ist ein Kompatibilitätsproblem.

    – nmr

    17. Februar 2012 um 23:11 Uhr

  • @Mike Das JavaDoc ist korrekt. Beachten Sie, dass der Code in dieser Antwort einen Satz von Objekten zurückgibt, keine booleschen Werte. newSetFromMap erstellt einen Satz des Typs der Schlüssel, nicht der Werte.

    – Kabuko

    4. Mai 2012 um 19:56 Uhr

Während Sie in der Tat verwenden können Collections.newSetFromMap() Um ein WeakSet zu erhalten, sind die Anwendungsfälle tatsächlich ziemlich begrenzt.

Wenn Sie so etwas implementieren möchten String.intern() Vielleicht möchten Sie sich Guava’s ansehen Interners.newWeakInterner() Funktionalität statt.

1225440cookie-checkWarum existiert WeakHashMap, aber kein WeakSet?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy