¿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 unaListrepresentació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 lanzaUnsupportedOperationExceptionpara 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.asListdevuelve una lista de tamaño fijo respaldada por la matriz especificada. El método devuelve una instancia de laArrayListcual es una clase estática privada anidada que se extiendeAbstractListy nojava.util.ArrayList. Esta clase estática proporciona la implementación de algunos métodos, por ejemplo,set, indexOf, forEach, replaceAlletc., pero cuando invocamosaddno tiene implementación propia, sino queAbstractListse invoca el método desde el que se lanzajava.lang.UnsupportedOperationException.El
Collections.singletonListdevuelve 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.unmodifiableListque 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