Necesito obtener una colección de java HashMap sin los cambios en el mapa reflejados en la colección más adelante. Quería usar Collection.toArray() para lograr esto, pero no está funcionando. El Objeto resultante [] también está cambiando (los javadocs dicen que la matriz devuelta será "segura" ya que esta colección no mantiene referencias a esta). ¿Alguna forma simple de lograr esto?¿Cómo obtener una colección inmutable de java HashMap?
Respuesta
No es posible hacer esto con una sola llamada de API, necesita utilizar la clonación profunda. Los clones no se modificarán cuando realice cambios en el original. Este tema ya se discutió anteriormente en SO, ver How to clone ArrayList and also clone its contents? y Deep clone utility recomendation.
Creo que esta respuesta podría ampliarse: ¿qué significa un "clon profundo" y cómo evita esto modificaciones o "referencias compartidas"? Un enlace puede ser útil ... –
@Perception: Gracias por la edición. –
Np, y buena respuesta. – Perception
Google collections Immutable Map puede ayudarlo.
ver Collections.unmodifiableMap también
Sin embargo, esto no dice nada sobre la mutabilidad de los objetos * contenidos *. –
Creo que el mapa inmutable de las colecciones de Google es lo que el OP está buscando. @pst: Mi lectura de la documentación me lleva a pensar que los objetos contenidos en com.google.common.collect.ImmutableMap son inmutables. –
mi comprensión es también la misma –
puede crear una inmodificable Map
Sin embargo, esto no dice nada sobre la mutabilidad de los objetos * con contenido. –
Sin mencionar los cambios en el mapa original se reflejan en la copia. – Perception
Creo que Justin tiene razón. el método 'unmodifiableMap' devolvería una vista de solo lectura del mapa que reflejaría cualquier cambio en el contenedor base y sanre6 no especificó que los objetos contenidos deberían ser inmutables, solo que el mapa debería ser. – Francois
El siguiente es todavía válida y se describe el problema observado (véase el bit de qué tipo de copia se realiza). Sin embargo, no proporciono ninguna respuesta en cómo para realizar una copia en profundidad.
En su lugar, mi sugerencia, es diseñar los objetos que serán immutable, que evita este problema por completo. En mi experiencia, esto funciona muy bien para la mayoría de los objetos triviales (es decir, los objetos que no son "contenedores") y puede simplificar el código y el razonamiento al respecto.
Desde el Javadoc para HashMap.values
:
Devuelve una vista Colección de los valores contenidos en este mapa. La colección está respaldado por el mapa, por lo cambios en el mapa se reflejan en la colección, y viceversa ...
tal vez sería beneficioso crear una copia de la misma?
HashMap<K,V> map = ....;
List<V> values = new ArrayList<V>(map.values());
Eso, en esencia, realiza una shallow-copy que es "ahora separar". Sin embargo, siendo una copia superficial, no se realiza clon/copia de los objetos contenidos. (Ver βнɛƨн respuesta de Ǥʋяʋиɢ si se desean deep-copy semántica: la pregunta en sí parece un poco vago al respecto.)
feliz de codificación
hice lo mismo, esto no funciona. Los cambios también se reflejan en la nueva lista – sanre6
@ sanre6. ¿Por "cambios" quiere decir "cambios a * los objetos ** en ** la colección *"? (A diferencia de "cambios en * la colección *"). Si es así, consulte los enlaces a copias superficiales/profundas, que explican el comportamiento observado, y la respuesta de βнɛƨн Ǥʋяʋиɢ. –
sí exactamente cambia a los objetos contenidos – sanre6
Crea una copia superficial del mapa original poco con HashMap.clone()
, a continuación, recuperar los valores colleation de ese. Esto creará nuevas referencias a los objetos en el mapa original en el momento de la llamada clone()
; obviamente los cambios dentro de los objetos contenidos se reflejarán en la colección copiada. Si desea este comportamiento, su única forma es copiar los objetos del mapa en su colección deseada.
- 1. ¿Cómo inicializar un hashmap inmutable de Scala con valores?
- 2. Java HashMap: ¿Cómo obtener una clave y valor por índice?
- 3. Obtener claves de HashMap en Java
- 4. impresión HashMap En Java
- 5. matriz inmutable en Java
- 6. Cómo crear una colección paralela de Scala a partir de una colección de Java
- 7. hacer una clase inmutable en java
- 8. ¿Python tiene una lista inmutable?
- 9. Java obtener el último elemento de una colección
- 10. la conversión de una colección de Java en una colección Scala
- 11. java: devolver una colección
- 12. ¿Cómo obtener los mismos valores de HashMap?
- 13. ¿Cómo puedo obtener una métrica sobre el número de colisiones en un Hashmap de Java?
- 14. Java HashMap elementos duplicados
- 15. Scala: cómo crear un mapa inmutable a partir de una colección de Tuple2s?
- 16. java HashMap iteración clave
- 17. Java XStream con HashMap
- 18. Java HashMap vs JSONObject
- 19. Cadena para HashMap JAVA
- 20. Java HashMap o IdentityHashMap
- 21. comportamiento fallido de java HashMap
- 22. Actualización de Java HashMap clave
- 23. Obtener todos los identificadores de una colección
- 24. Cómo convertir un HashMap mutable en un equivalente inmutable en Scala?
- 25. Cómo convertir una colección java de imágenes a CvArr
- 26. ¿Qué es una colección java?
- 27. Convertir mutable a mapa inmutable
- 28. Java - Hacer una colección de objetos amigable
- 29. Java clase HashMap por valor
- 30. Java: ordenar una colección utilizando una CollatorKey
No entendí claramente lo que intentas lograr. ¿Pero es LinkedHashMap lo que estás buscando? – batbaatar
No ... el orden de inserción no es lo que estoy buscando. digamos que tenemos HashMap de. Hashmap.values () me devolverá una colección .Ahora, cualquier cambio en HashMap se refleja en esta colección, que es el comportamiento predeterminado. Pero necesito una colección fija en la que no se reflejen los cambios en el mapa –
sanre6
@ sanre6 ¿Te refieres a cambios en * elementos * (objetos) contenía el HashMap, por casualidad? –