tutorial sort example empty java collections empty-list

sort - java collections example



Collections.emptyList() vs. nueva instancia (7)

En la práctica, es mejor devolver una lista vacía como this :

return Collections.emptyList();

O así:

return new ArrayList<Foo>();

¿O es esto completamente dependiente de lo que vas a hacer con la lista devuelta?


A partir de Java 5.0 puede especificar el tipo de elemento en el contenedor:

Collections.<Foo>emptyList()

Estoy de acuerdo con las otras respuestas de que, para los casos en los que desee devolver una lista vacía que permanezca vacía, debe utilizar este método.


Iría con Collections.emptyList() si la lista devuelta no se modifica de ninguna manera (ya que la lista es inmutable), de lo contrario iría con la opción 2.

La ventaja de Collections.emptyList() es que la misma instancia estática se devuelve cada vez y, por lo tanto, no se produce la creación de la instancia para cada llamada.


La principal diferencia es que this devuelve una lista inmutable , es decir, una lista a la que no puede agregar elementos.

En los casos excepcionales en los que desea modificar la lista devuelta, esto no sería una opción.

Yo diría que devolver una lista inmutable es perfectamente correcto (e incluso la forma preferida) siempre que el contrato (documentación) no se establezca explícitamente de manera diferente.

Además, emptyList() podría no crear un nuevo objeto con cada llamada.

Las implementaciones de este método no necesitan crear un objeto de lista separado para cada llamada. Es probable que el uso de este método tenga un costo comparable al uso del campo con el mismo nombre. (A diferencia de este método, el campo no proporciona seguridad de tipo).

La implementación de emptyList ve como sigue:

public static final <T> List<T> emptyList() { return (List<T>) EMPTY_LIST; }

Por lo tanto, si su método (que devuelve una lista vacía) se llama con mucha frecuencia, este enfoque puede brindarle un rendimiento ligeramente mejor tanto de la CPU como de la memoria.


Las respuestas dadas subrayan el hecho de que emptyList() devuelve una List inmutable pero no ofrece alternativas. Los casos especiales 0 Constructor ArrayList(int initialCapacity) así que devolver una new ArrayList<>(0) lugar de una new ArrayList<>() también podría ser una solución viable:

/** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {};

[...]

/** * Constructs an empty list with the specified initial capacity. * * @param initialCapacity the initial capacity of the list * @throws IllegalArgumentException if the specified initial capacity * is negative */ public ArrayList(int initialCapacity) { if (initialCapacity > 0) { this.elementData = new Object[initialCapacity]; } else if (initialCapacity == 0) { this.elementData = EMPTY_ELEMENTDATA; } else { throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); } }

(fuentes de Java 1.8.0_72)


Tenga cuidado sin embargo. Si devuelve Collections.emptyList() y luego intenta hacer algunos cambios con él como add() o smth así, u tendrá una UnsupportedOperationException() porque Collections.emptyList() devuelve un objeto inmutable.


Use Collections.emptyList () si desea asegurarse de que la lista devuelta nunca se modifique. Esto es lo que se devuelve al llamar a emptyList ():

/** * The empty list (immutable). */ public static final List EMPTY_LIST = new EmptyList();


Collections.emptyList es inmutable, por lo que hay una diferencia entre las dos versiones, por lo que debe considerar a los usuarios del valor devuelto.

La devolución de una new ArrayList<Foo> siempre crea una nueva instancia del objeto, por lo que tiene un costo extra muy pequeño asociado que puede darle una razón para usar Collections.emptyList . Me gusta usar emptyList solo porque es más legible.