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?
Respuestas:
Sí, ya que agregó una referencia al objeto en la lista. La referencia que agregó seguirá apuntando al mismo objeto (que modificó).
No, no copiará el objeto. (Copiará la referencia al objeto).
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]
fuente
String
y luego cambiarlo. ieString a = "first"; list.add(a); a = "second"; ...print(list.get(0)) // "first"
pass by value
ya 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 algoCualquier 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.
fuente
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
fuente
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]
fuente