ConcurrentHashMap.newKeySet()
ist nur ein Teil einer Funktion, die viel breiter ist als Collections.newSetFromMap(new ConcurrentHashMap<>())
.
Der Unterschied wird deutlich, wenn man sich diesem Beispiel aussehen:
Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");
Statt Mapping Boolean.TRUE
Sie jetzt den Wert "hello"
hinzuzufügen, wenn ein neuer Wert der Set
hinzufügen.
Deshalb haben die zurückgegebenen Set
s den Typ ConcurrentHashMap.KeySetView
. Dieser Typ verfügt über zusätzliche Methoden für asking for the backing map sowie which value will be used when adding new keys.
So, während ConcurrentHashMap.newKeySet()
sieht aus wie das gleiche zu tun wie Collections.newSetFromMap(new ConcurrentHashMap<>())
, gibt es den semantischen Unterschied, dass letztere sagt, Sie nicht die Karte später verwenden sollte, während die früheren Teil eines Merkmals ist, die mit der Interaktion ausgelegt ist Karte.
Siehe Collections.newSetFromMap
:
Die angegebene Karte zum Zeitpunkt dieser Methode muss leer sein, aufgerufen wird, und soll nicht direkt nach Rückgabe dieser Methode zugegriffen werden.
In der Tat ist es nicht einmal festgelegt, dass Collections.newSetFromMap
Boolean.TRUE
für zusätzliche verwenden Werte-Sie sollten nie mit dem ohnehin beschäftigen ...
Es könnte auch nützlich sein, wenn Sie die Set
passieren wan Code, der explizit eine anfordert.
Wenn Sie das Ergebnis verwenden Set
die Kompilierung-Typ mit nur gibt es immer noch die Möglichkeit, dass Code, der empfängt, dass Set
instanceof
/Typ verwenden wirft, um herauszufinden, dass das Ergebnis der ConcurrentHashMap.newKeySet()
durch gesichert ist a ConcurrentHashMap
während das Ergebnis von Collections.newSetFromMap
wird Ihnen nicht sagen. Auf der anderen Seite, die auch Code unbeabsichtigte Dinge mit BackingMap auf diese Weise ...
Es ist kürzer ... – Reimeus