Agregue un objeto a una ArrayList y modifíquelo más tarde

80

Si tengo una ArrayList y le agregué un objeto, y luego modifiqué este objeto, ¿se reflejará este cambio en la ArrayList? o cuando agrego el objeto a ArrayList, ¿Java crea una copia y la agrego a ArrayList?

¿Qué pasa si cambio la referencia a este objeto a nulo? ¿Eso significa que el objeto en ArrayList ahora también es nulo?

K ''
fuente
1
¡Esta pregunta (y respuesta) realmente merece un marcador!
Terry
Solo todas las preguntas que estaba a punto de hacer :)
navid

Respuestas:

84

¿Se reflejará este cambio en ArrayList?

Sí, ya que agregó una referencia al objeto en la lista. La referencia que agregó seguirá apuntando al mismo objeto (que modificó).


o cuando agrego el objeto a ArrayList, Java crea una copia y la agrego a ArrayList?

No, no copiará el objeto. (Copiará la referencia al objeto).


¿Qué pasa si cambio la referencia a este objeto a nulo? ¿Eso significa que el objeto en ArrayList ahora también es nulo?

No, ya que el contenido de la referencia original se copió cuando se agregó a la lista. (Tenga en cuenta que lo que se copia es la referencia , no el objeto).

Demostración:

StringBuffer sb = new StringBuffer("foo");

List<StringBuffer> list = new ArrayList<StringBuffer>();
list.add(sb);

System.out.println(list);   // prints [foo]
sb.append("bar");

System.out.println(list);   // prints [foobar]

sb = null;

System.out.println(list);   // still prints [foobar]
aioobe
fuente
¿qué pasa con esto? Botón a = nuevo botón; Botón b = nuevo botón; Botón actual = a; List.add (actual); actual = b; Si imprimo el contenido de la lista, ¿será "a" o "b"?
Lorenzo Sciuto
1
@aioobe Tu respuesta parece entrar en conflicto con el primer punto de tu publicación en el que indicas que se copia la referencia al objeto (en este caso, 'actual'), que luego se cambia de a a b. Esperaba que imprimiera b. ¿Puedes elaborar?
Jan K.
2
Solo tenga en cuenta que Java siempre se pasa por valor (en particular, las referencias a objetos se pasan por valor) y todo debe estar claro.
aioobe
este no parece ser el caso de agregar un Stringy luego cambiarlo. ieString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
Don Cheadle
Creo que es posible que desee aclarar lo que se entiende por, pass by valueya que eso parecería implicar que lo que se envió no se puede alterar ya que se ha enviado el valor, no una referencia a algo
Don Cheadle
5

Cualquier cambio en el objeto se reflejará en la lista.

Sin embargo, cuando se trata de objetos como cadenas que son inmutables, se creará un nuevo objeto en "operaciones de cambio". De hecho, su objeto antiguo todavía está en la lista, mientras que tiene uno nuevo en otro lugar.

DerMike
fuente
esta es una distinción muy importante
Don Cheadle
1

Gracias a todos. Lo descubrí de nuevo leyendo tus publicaciones. Probablemente sea un concepto confuso, ya que lo hice digerir hace mucho tiempo, pero recientemente olvidé cómo funciona nuevamente. Así que quiero compartir la clave que me resuelve el problema. (tenga en cuenta que los objetos no primitivos (los primitivos son int, booleanos, etc.) en java son técnicamente punteros). Cuando u agrega el objeto o a una lista, la lista y la o apuntan a lo mismo, por lo que cuando modifica o cambia el elemento de la lista. Esto es siempre que apunten a lo mismo y se rompa cuando o apunta a otra cosa con = .

o = null;   //o points to nothing and changes in o from now on doesn't effect the list's item

o

Object a = new Object();
o = a;    //o and the list's item don't point to same thing so changes in o doesn't effect the list's item (but it effects a)

espero que ayude a alguien

navid
fuente
-1

Quería agregar otra demostración en la que ArrayList está dentro de un mapa como valor. ArrayList se modifica después de agregarlo al mapa y el mapa refleja los cambios.

El mapa tiene un elemento con el nombre de la madre como clave y los niños como valor.

    String key = "adeleMom";
    Map<String, ArrayList<String>> myMap = new HashMap<String, ArrayList<String>>();
    ArrayList<String> firstList = new ArrayList<String>();
    firstList.add("adele");
    myMap.put(key, firstList);
    firstList = null;
    ArrayList secondList = myMap.get(key);
    System.out.println(secondList); // prints [adele]
    secondList.add("bonnie");
    System.out.println("Added bonnie");
    ArrayList thirdList = myMap.get(key);
    System.out.println(thirdList); // prints [adele, bonnie]
user2176745
fuente