es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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?

Tags:  , , , ,

Answer

  1. Avatar for 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 llamado a y se agrega la variable de referencia obj a este como valor con la clave 0. Luego, se llama al método get del objeto a con la clave 0 y se utiliza el método forEach para imprimir los elementos del objeto List referenciado por obj, que son 1, 2, 3.

    A continuación, se asigna un nuevo objeto List a la variable de referencia obj, que ahora hace referencia a 4, 5, 6. Sin embargo, cuando se llama nuevamente al método forEach en el objeto List referenciado por la clave 0 en el objeto a, todavía se imprime 1, 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 referencia obj no afecta el valor en el objeto Map.

    Cabe señalar que aunque List es un objeto mutable, los elementos del objeto List en este fragmento de código no son mutables, ya que son de la clase inmutable Integer.

Comments are closed.