¿El Map almacena una copia de la variable de referencia o una copia del objeto?
Tengo esta pequeña porción de código y quiero saber si las implementaciones de java.Util.Map
almacenan una copia de la variable de referencia o una copia del objeto.
public static void main(String[] args) {
List<integer> obj = Arrays.asList(1,2,3);
Map<integer,></integer,><integer>> a = new HashMap<>();
a.put(0, obj);
a.get(0).forEach(System.out::print);
obj = Arrays.asList(4,5,6);
System.out.println();
a.get(0).forEach(System.out::print);
}
Salida
123
123
Tuve la sensación de que la respuesta a esto ya debe existir (bueno, podría existir, pero no pude encontrarla). Leí las siguientes respuestas, pero no obtuve mucho sobre mi problema.
https://stackoverflow.com/questions/7297937/does-java-return-by-reference-or-by-value
Esta respuesta dice que podría haber ocurrido si Integer
fuese mutable, pero ArrayList
es mutable (https://stackoverflow.com/questions/40438544/is-java-util-list-mutable), entonces ¿por qué no está sucediendo?
davy.ai
Basado en el fragmento de código y el resultado proporcionados, parece que la implementación de
java.util.Map
almacena una copia de la variable de referencia y no una copia del objeto en sí.En el fragmento de código, se crea un nuevo objeto
HashMap
llamadoa
y se agrega la variable de referenciaobj
a este como valor con la clave0
. Luego, se llama al métodoget
del objetoa
con la clave0
y se utiliza el métodoforEach
para imprimir los elementos del objetoList
referenciado porobj
, que son1, 2, 3
.A continuación, se asigna un nuevo objeto
List
a la variable de referenciaobj
, que ahora hace referencia a4, 5, 6
. Sin embargo, cuando se llama nuevamente al métodoforEach
en el objetoList
referenciado por la clave0
en el objetoa
, todavía se imprime1, 2, 3
.Esto indica que el objeto
Map
almacena y devuelve una copia de la variable de referencia, y no una copia del objeto actual. Por eso, cambiar la variable de referenciaobj
no afecta el valor en el objetoMap
.Cabe señalar que aunque
List
es un objeto mutable, los elementos del objetoList
en este fragmento de código no son mutables, ya que son de la clase inmutableInteger
.