¿Hay alguna ventaja (o mucha diferencia) en usar Arrays.asList (algo) sobre Collections.singletonList (algo) para hacer una lista que contenga un elemento? Esto último también hace que la lista devuelta sea inmutable.
java
collections
Howard Grimberg
fuente
fuente
ImmutableList.of()
y tambiénLists.newArrayList()
en la mezcla.Respuestas:
Collections.singletonList(something)
es inmutable, mientras queArrays.asList(something)
es unaList
representación de tamaño fijo de una matriz donde la lista y la matriz se unen en el montón.Arrays.asList(something)
permite realizar cambios no estructurales , que se reflejan tanto en la Lista como en la matriz conjunta. Se lanzaUnsupportedOperationException
para agregar, eliminar elementos, aunque puede establecer un elemento para un índice particular.Cualquier cambio realizado en la Lista devuelto por
Collections.singletonList(something)
resultará enUnsupportedOperationException
.Además, la capacidad de la Lista devuelta por
Collections.singletonList(something)
siempre será 1, a diferencia deArrays.asList(something)
cuya capacidad será el tamaño de la matriz respaldada.fuente
Solo agregaría que la lista única no está respaldada por una matriz y solo tiene una referencia a ese elemento. Presumiblemente, tomaría menos memoria y puede ser significativo dependiendo de la cantidad de listas que desee crear.
fuente
El método
Arrays.asList
devuelve una lista de tamaño fijo respaldada por la matriz especificada. El método devuelve una instancia de laArrayList
cual es una clase estática privada anidada que se extiendeAbstractList
y nojava.util.ArrayList
. Esta clase estática proporciona la implementación de algunos métodos, por ejemplo,set, indexOf, forEach, replaceAll
etc., pero cuando invocamosadd
no tiene implementación propia, sino queAbstractList
se invoca el método desde el que se lanzajava.lang.UnsupportedOperationException
.El
Collections.singletonList
devuelve una lista inmutable que contiene solo el objeto especificado y también es serializable.En una nota al margen, para las listas inmutables generalmente utilizamos
Collections.unmodifiableList
que devuelve una vista no modificable de la lista especificada.Una colección de vistas no modificables es una colección que no se puede modificar y también es una vista de una colección de respaldo. Tenga en cuenta que los cambios en la colección de respaldo aún podrían ser posibles, y si ocurren, son visibles a través de la vista no modificable.
Podemos tener una verdadera lista inmutable en Java 10 y versiones posteriores. Hay dos formas de obtener una lista verdaderamente inmodificable :
var unmodifiableList = List.copyOf(srcList);
var unmodifiableList = srcList.stream().collect(Collectors.toUnmodifiableList());
Si se usa alguna de estas dos variables, el valor seguirá siendo "Apple" y no "Apricot".Según el documento de Java 10 :
fuente