ConcurrentHashMap.newKeySet () vs Collections.newSetFromMap () - Java, Satz, Java-8, java.util.concurrent, Concurrenthashmap

Java 8 hat eine neue Möglichkeit eingeführt, um eine gleichzeitige zu erhalten Set Implementierung

// Pre-Java-8 way to create a concurrent set
Set<String> oldStyle = Collections.newSetFromMap(new ConcurrentHashMap<>());
// New method in Java 8
Set<String> newStyle = ConcurrentHashMap.newKeySet();

Gibt es einen Grund, eine neue Methode zu bevorzugen?

Irgendwelche Vorteile / Nachteile?

Antworten:

5 für die Antwort № 1

ConcurrentHashMap.newKeySet() sollte etwas effizienter sein, wie eine einzelne Ebene der Umleitung entfernt. Collections.newSetFromMap(map) basiert hauptsächlich auf der Umleitung der Operationen auf die map.keySet(), aber ConcurrentHashMap.newKeySet() ist sehr nah dran map.keySet() selbst (nur mit Ergänzungen Unterstützung).

Was die Funktionalität betrifft, sehe ich keinen Unterschied.


12 für die Antwort № 2

ConcurrentHashMap.newKeySet() ist nur ein Teil einer Funktion, die viel breiter ist als Collections.newSetFromMap(new ConcurrentHashMap<>()).

Der Unterschied wird deutlich, wenn Sie sich dieses Beispiel ansehen:

Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");

Anstatt zu mappen Boolean.TRUE Sie fügen jetzt den Wert hinzu "hello" wenn Sie einen neuen Wert hinzufügen Set.

Deshalb ist das zurückgekommen Sets haben den Typ ConcurrentHashMap.KeySetView. Dieser Typ verfügt über zusätzliche Methoden für nach der Backing Map fragen ebenso gut wie welcher Wert wird beim Hinzufügen neuer Schlüssel verwendet.


Also, während ConcurrentHashMap.newKeySet() sieht so aus, als würde man dasselbe tun Collections.newSetFromMap(new ConcurrentHashMap<>())Es gibt den semantischen Unterschied, dass der letztere sagt, dass Sie die Karte nicht später verwenden sollten, während der erstere Teil eines Features ist, das entworfen wurde, um mit der Karte zu interagieren.

Sehen Collections.newSetFromMap:

Die angegebene Map muss zum Zeitpunkt des Aufrufs dieser Methode leer sein und sollte nicht direkt aufgerufen werden, nachdem diese Methode zurückgegeben wurde.

In der Tat ist es nicht einmal angegeben Collections.newSetFromMap wird benutzen Boolean.TRUE für zusätzliche Werte - Sie sollten sich nie damit befassen ...


Es könnte auch nützlich sein, wenn Sie die Set um Code zu programmieren, der explizit a anfordert ConcurrentHashMap.KeySetView.


Wenn Sie das Ergebnis mit dem Kompilierzeittyp verwenden Set nur, es gibt immer noch die möglichkeit, dass der code das bekommt Set wird benutzen instanceof/ type wirft, um herauszufinden, dass das Ergebnis von ConcurrentHashMap.newKeySet() wird von einem unterstützt ConcurrentHashMap während das Ergebnis von Collections.newSetFromMap Ich werde es dir nicht sagen. Auf der anderen Seite erlaubt das Code auch, unbeabsichtigte Dinge mit Hintergrundkarte auf diese Weise zu tun ...


Speisekarte