Desde el Resumen del marco de colecciones :
Las colecciones que no admiten operaciones de modificación (como
add
,remove
yclear
) se denominan no modificables . Las colecciones que no son inmodificables son modificables .Las colecciones que además garantizan que ningún cambio en el
Collection
objeto será visible se denominan inmutables . Las colecciones que no son inmutables son mutables .
No puedo entender la distinción.
¿Cuál es la diferencia entre inmodificable e inmutable aquí?
fuente
list
. Si algo puede llamarlist.add(10)
luegocoll
, reflejará ese cambio, así que no, no lo llamaría inmutable.Básicamente,
unModifiable
Collection es una vista, por lo que, indirectamente, aún podría 'modificarse' desde alguna otra referencia que sea modificable. Además, como es solo una vista de solo lectura de otra colección, cuando la colección de origen cambia, la Colección no modificable siempre se presentará con los últimos valores.Sin embargo, la
immutable
Colección puede tratarse como una copia de solo lectura de otra colección y no puede modificarse. En este caso, cuando la colección de origen cambia, la Colección inmutable no refleja los cambios.Aquí hay un caso de prueba para visualizar esta diferencia.
Salida
fuente
modifiableList
yunModifiableList
ha aumentadoimmutableList
el tamaño no ha cambiadonew ArrayList<String>(modifiableList)
inmutableList no se puede modificarnew ArrayList<String>(modifiableList)
causa denew
? Gracias.Creo que la principal diferencia es que el propietario de una colección mutable puede querer proporcionar acceso a la colección a algún otro código, pero proporcionar ese acceso a través de una interfaz que no permite que el otro código modifique la colección (al tiempo que reserva esa capacidad al código de propiedad). Por lo tanto, la colección no es inmutable, pero a ciertos usuarios no se les permite cambiarla.
El tutorial de Java Collection Wrapper de Oracle tiene esto que decir (énfasis agregado):
fuente
Si estamos hablando de JDK
Unmodifiable*
vs guayabaImmutable*
, en realidad la diferencia también está en el rendimiento . Colecciones inmutables pueden ser a la vez más rápido y más memoria eficientes si son no envolturas alrededor de las colecciones regulares (JDK implementaciones son envolturas). Citando al equipo de guayaba :El JDK proporciona métodos Collections.unmodifiableXXX, pero en nuestra opinión, estos pueden ser
<...>
fuente
List.of(...)
, copia dos veces.Para citar los Tutoriales de Java ™ :
(énfasis mío)
Esto realmente lo resume.
fuente
Como se señaló anteriormente, no modificable no es como inmutable porque una colección no modificable puede modificarse si, por ejemplo, una colección no modificable tiene una colección delegada subyacente a la que hace referencia otro objeto y ese objeto la cambia.
En cuanto a lo inmutable, ni siquiera está bien definido. Sin embargo, generalmente significa que el objeto "no cambiará", pero eso debería definirse de forma recursiva. Por ejemplo, puedo definir inmutable en clases cuyas variables de instancia son todas primitivas y cuyos métodos no contienen argumentos ni primitivas de retorno. Los métodos permiten recursivamente que las variables de instancia sean inmutables y que todos los métodos contengan argumentos que sean inmutables y que devuelvan valores inmutables. Se debe garantizar que los métodos devuelvan el mismo valor con el tiempo.
Suponiendo que podamos hacer eso, también existe el concepto de hilo seguro. Y es posible que te haga creer que inmutable (o que no se puede cambiar con el tiempo) también implica un hilo seguro. Sin embargo, este no es el casoy ese es el punto principal que estoy haciendo aquí que aún no se ha observado en otras respuestas. Puedo construir un objeto inmutable que siempre devuelve los mismos resultados pero no es seguro para subprocesos. Para ver esto, suponga que construyo una colección inmutable manteniendo adiciones y eliminaciones a lo largo del tiempo. Ahora la colección inmutable devuelve sus elementos mirando la colección interna (que puede estar cambiando con el tiempo) y luego (internamente) agregando y eliminando los elementos que se agregaron o eliminaron después de la creación de la colección. Claramente, aunque la colección siempre devolvería los mismos elementos, no es segura para subprocesos simplemente porque nunca cambiará el valor.
Ahora podemos definir inmutables como objetos que son seguros para subprocesos y que nunca cambiarán. Hay pautas para crear clases inmutables que generalmente conducen a tales clases, sin embargo, tenga en cuenta que puede haber formas de crear clases inmutables, que requieren atención a la seguridad de los subprocesos, por ejemplo, como se describe en el ejemplo de colección "instantánea" anterior.
fuente
Los Tutoriales de Java ™ dicen lo siguiente:
Creo que es una explicación lo suficientemente buena como para entender la diferencia.
fuente