C'è un vantaggio (o molta differenza) nell'uso di Arrays.asList (qualcosa) rispetto a Collections.singletonList (qualcosa) per creare un elenco contenente un elemento? Quest'ultimo rende immutabile anche l'elenco restituito.
C'è un vantaggio (o molta differenza) nell'uso di Arrays.asList (qualcosa) rispetto a Collections.singletonList (qualcosa) per creare un elenco contenente un elemento? Quest'ultimo rende immutabile anche l'elenco restituito.
Risposte:
Collections.singletonList(something)
è immutabile mentre Arrays.asList(something)
è una List
rappresentazione a dimensione fissa di un array in cui l'elenco e l'array vengono uniti nell'heap.
Arrays.asList(something)
consente modifiche non strutturali apportate ad esso, che vengono riflesse sia nella Lista che nella matrice congiunta. Genera UnsupportedOperationException
per l'aggiunta, la rimozione di elementi sebbene sia possibile impostare un elemento per un determinato indice.
Tutte le modifiche apportate all'elenco restituito da Collections.singletonList(something)
comporteranno UnsupportedOperationException
.
Inoltre, la capacità dell'elenco restituito Collections.singletonList(something)
sarà sempre 1 a differenza della Arrays.asList(something)
cui capacità sarà la dimensione dell'array supportato.
Vorrei solo aggiungere che la singletonlist non è supportata da un array e ha solo un riferimento a quell'unico elemento. Presumibilmente, richiederebbe meno memoria e può essere significativo a seconda del numero di elenchi che si desidera creare.
Il metodo Arrays.asList
restituisce un elenco di dimensioni fisse supportato dall'array specificato. Il metodo restituisce un'istanza di ArrayList
cui è una classe statica nidificata privata che si estende AbstractList
e non java.util.ArrayList
. Questa classe statica fornisce l'implementazione di pochi metodi, ad es set, indexOf, forEach, replaceAll
. Ecc. Ma quando invochiamo add
non ha un'implementazione propria, piuttosto AbstractList
viene invocato il metodo da che genera java.lang.UnsupportedOperationException
.
I Collections.singletonList
rendimenti di una lista immutabile contenente solo l'oggetto specificato ed è serializzabile pure.
In una nota a margine , per gli elenchi immutabili usiamo generalmente ciò Collections.unmodifiableList
che restituisce una vista non modificabile dell'elenco specificato.
List<String> srcList = Arrays.asList("Apple", "Mango", "Banana");
var fruits = new ArrayList<>(srcList);
var unmodifiableList = Collections.unmodifiableList(fruits);
fruits.set(0, "Apricot");
var modFruit = unmodifiableList.get(0);
System.out.println(modFruit); // prints Apricot
Una raccolta di viste non modificabile è una raccolta non modificabile ed è anche una vista su una raccolta di supporto. Si noti che le modifiche alla raccolta di backup potrebbero essere ancora possibili e, se si verificano, sono visibili attraverso la vista non modificabile.
Possiamo avere un vero elenco immutabile in Java 10 e versioni successive. Esistono due modi per ottenere un elenco davvero non modificabile :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Se viene utilizzata una di queste due variabili, il valore sarà comunque "Apple" e non "Albicocca". Secondo il documento di Java 10 :
I metodi factory statici
List.of
eList.copyOf
forniscono un modo conveniente per creare elenchi non modificabili. Le istanze di Elenco create con questi metodi hanno le seguenti caratteristiche:
- Sono immodificabili . Gli elementi non possono essere aggiunti, rimossi o sostituiti. La chiamata a qualsiasi metodo mutatore sull'Elenco provoca sempre il
UnsupportedOperationException
lancio. Tuttavia, se gli elementi contenuti sono essi stessi mutabili, ciò può far sembrare che il contenuto dell'elenco cambi.- Non consentono elementi nulli. I tentativi di crearli con elementi null risultano in
NullPointerException
.- Sono serializzabili se tutti gli elementi sono serializzabili.
- L'ordine degli elementi nell'elenco è uguale all'ordine degli argomenti forniti o degli elementi nell'array fornito.
- Lo sono
value-based
. I chiamanti non devono fare ipotesi sull'identità delle istanze restituite. Le fabbriche sono libere di creare nuove istanze o riutilizzare quelle esistenti. Pertanto, le operazioni sensibili all'identità in queste istanze (uguaglianza di riferimento (==), codice hash identità e sincronizzazione) non sono affidabili e dovrebbero essere evitate.- Sono serializzati come specificato nella pagina Modulo serializzato .
ImmutableList.of()
e ancheLists.newArrayList()
nel mix.