Mapa no modificable (Colecciones Java) vs Mapa inmutable (Google) [duplicado]


Esta pregunta ya tiene una respuesta aquí:

Context

Necesito devolver una referencia a un mapa que estoy usando para una caché de datos, y me gustaría asegurarme de que nadie pueda modificar su referencia.

Pregunta

He visto muchas referencias a unmodifiableMap e ImmutableMap en línea, pero no veo nada comparándolos / contrastándolos. Me imagino que hay una buena razón por la que Google / Guava creó su propia versión: ¿puede alguien decirme qué es?

Author: John Humphreys - w00te, 2014-03-25

4 answers

Un mapa no modificable todavía puede cambiar. Es solo una vista en un mapa modificable, y los cambios en el mapa de respaldo serán visibles a través del mapa no modificable. El mapa no modificable solo evita modificaciones para aquellos que solo tienen la referencia a la vista no modificable:

Map<String, String> realMap = new HashMap<String, String>();
realMap.put("A", "B");

Map<String, String> unmodifiableMap = Collections.unmodifiableMap(realMap);

// This is not possible: It would throw an 
// UnsupportedOperationException
//unmodifiableMap.put("C", "D");

// This is still possible:
realMap.put("E", "F");

// The change in the "realMap" is now also visible
// in the "unmodifiableMap". So the unmodifiableMap
// has changed after it has been created.
unmodifiableMap.get("E"); // Will return "F". 

En contraste con eso, el mapa inmutable de Guayaba es realmente inmutable: Es una verdadera copia de un mapa dado, y nadie puede modificar este mapa inmutable de ninguna manera.

Actualización :

Como se señala en un comentario , también se puede crear un mapa inmutable con la API estándar utilizando

Map<String, String> immutableMap = 
    Collections.unmodifiableMap(new LinkedHashMap<String, String>(realMap)); 

Esto creará una vista no modificable en una copia verdadera del mapa dado, y por lo tanto emula muy bien las características de la ImmutableMap sin tener que agregar la dependencia a la Guayaba.

 137
Author: Marco13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:10:11

Echa un vistazo a ImmutableMap JavaDoc: doc

Hay información sobre eso allí:

A diferencia de las Colecciones.Mapa no modificable (java.útil.Map), que es una vista de un mapa separado que todavía puede cambiar, una instancia de ImmutableMap contiene sus propios datos y nunca cambiará. ImmutableMap es conveniente para mapas finales estáticos públicos ("mapas constantes") y también le permite hacer fácilmente una "copia defensiva" de un mapa proporcionado a su clase por una persona que llama.

 7
Author: Jakub H,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-25 13:52:47

Documentación de guayaba

El JDK proporciona Collections.unmodifiableXXX métodos, pero en nuestra opinión, estos pueden ser difíciles de manejar y detallados; desagradable de usar en todas partes que desee hacer copias defensivas inseguras: las colecciones devueltas solo son verdaderamente inmutables si nadie tiene una referencia a la colección original ineficiente: las estructuras de datos todavía tienen toda la sobrecarga de las colecciones mutables, incluidas las comprobaciones de modificación concurrentes, espacio adicional en las tablas hash, etc.

 2
Author: Eric Stein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-25 23:15:48

ImmutableMap no acepta null valores mientras que Collections.unmodifiableMap() sí. Además, nunca cambiará después de la construcción, mientras que UnmodifiableMap puede. Desde el JavaDoc:

Un mapa inmutable basado en hash con un orden de iteración fiable especificado por el usuario. No permite claves o valores nulos.

A diferencia de las Colecciones.Mapa no modificable (java.útil.Map), que es una vista de un mapa separado que todavía puede cambiar, una instancia de ImmutableMap contiene sus propios datos y nunca cambiará. Mapa inmutable es conveniente para mapas finales estáticos públicos ("mapas constantes") y también le permite hacer fácilmente una "copia defensiva" de un mapa proporcionado a su clase por una persona que llama.

 2
Author: Harmlezz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-25 10:26:24