java collections comparison guava

java - ¿Cuál es la diferencia entre ImmutableList de Google y Collections.unmodifiableList()?



comparison guava (5)

De los javadocs de ImmutableList:

A diferencia de Collections.unmodifiableList (java.util.List), que es una vista de una colección separada que aún puede cambiar, una instancia de ImmutableList contiene sus propios datos privados y nunca cambiará. ImmutableList es conveniente para listas finales estáticas públicas ("listas constantes") y también le permite hacer fácilmente una "copia defensiva" de una lista proporcionada a su clase por una persona que llama.

¿Significa eso?

  1. si tengo objetos ImmuntableList of Dimension (por ejemplo), entonces no puedo cambiar ningún objeto Dimension en él?
  2. y si tengo Collections.unmodifiableList (list) de objetos Dimension, entonces no solo puedo agregar o eliminar cualquier objeto, sino que puedo cambiarlos (por ejemplo, llamar al método setDimension (ancho, alto)).

  1. No, los objetos individuales contenidos pueden ser modificados. Una colección realmente solo almacena referencias a los objetos contenidos, no una copia completa de cada objeto.
  2. Puede modificar la lista modificando la Colección padre a la que llamó Collections.unmodifiableList (list) en. Pero sí, PUEDE usar setDimension para cambiar un elemento de lista almacenado.

No, la inmutabilidad solo se aplica a la cantidad y las referencias de los objetos en la Colección, y no aborda la mutabilidad de los objetos que colocas en la Colección.

Lo que la lista inmutable gana con respecto a JDK Collections.unmodifiableList estándar es que al usar ImmutableList tiene la garantía de que los objetos a los que se hace referencia, su orden y el tamaño de la lista no pueden cambiar de ninguna fuente. Con Collections.unmodifiableList si algo más tiene una referencia a la lista subyacente, ese código puede modificar la lista aunque tenga una referencia a una lista no modificable.

Sin embargo, si desea una verdadera inmutabilidad, debe completar la lista con objetos inmutables.


También es posible que desee echar un vistazo a esta pregunta (¿Cuál es la diferencia entre Collections.unmodifiableSet() y ImmutableSet de Guava).


ImmutableList es similar a Collections.unmodifiableList( new ArrayList( list ) ) . Tenga en cuenta que ArrayList recién creado no está asignado a un campo o variable.


El uso de Collections.unmodifiableList crea un contenedor alrededor de su lista. si la lista subyacente cambia, también lo hace su vista de la lista no modificable.

Como dice la documentación, el código de Google crea una copia. Es un cálculo más caro y consume más memoria, pero si alguien altera la lista original, no puede afectar a la ImmutableList.

Ninguno de estos le impedirá cambiar un objeto en una lista, o sus campos, campos de campos, etc.