ConcurrentHashMap.newKeySet()
è solo una parte di una funzionalità che è molto più ampia di Collections.newSetFromMap(new ConcurrentHashMap<>())
.
La differenza diventa evidente se si guarda a questo esempio:
Set<String> set=new ConcurrentHashMap<String,String>().keySet("hello");
Invece di mappatura per Boolean.TRUE
ora si sta aggiungendo il valore "hello"
quando si aggiunge un nuovo valore al Set
.
Ecco perché il Set
restituito ha il tipo ConcurrentHashMap.KeySetView
. Questo tipo ha metodi aggiuntivi per asking for the backing map e which value will be used when adding new keys.
Così, mentre ConcurrentHashMap.newKeySet()
sembra fare lo stesso come Collections.newSetFromMap(new ConcurrentHashMap<>())
, v'è la differenza semantica che quest'ultimo dice che non si dovrebbe usare la mappa successivamente, mentre il primo è parte di una caratteristica che è stato progettato per interagire con il carta geografica.
Vedi Collections.newSetFromMap
:
La mappa specificato deve essere vuoto al momento questo metodo viene richiamato, e non è possibile accedere direttamente dopo questo metodo restituisce.
In realtà, non è nemmeno specificato che Collections.newSetFromMap
utilizzerà Boolean.TRUE
per Plusvalore-non si dovrebbe mai fare con questo in ogni caso ...
Potrebbe anche essere utile quando si wan per passare il Set
al codice che richiede esplicitamente un ConcurrentHashMap.KeySetView
.
Se si utilizza il risultato utilizzando il tipo in fase di compilazione Set
solo, c'è ancora la possibilità che il codice che riceve che Set
utilizzerà instanceof
/tipo di calchi di scoprire che il risultato di ConcurrentHashMap.newKeySet()
è sostenuta da a ConcurrentHashMap
mentre il risultato di Collections.newSetFromMap
non lo dirà. D'altra parte, ciò consente anche al codice di fare cose non intenzionali con la mappa di supporto in questo modo ...
È più breve ... – Reimeus