corro siguientes códigos en Eclipse:
ArrayList<StringBuilder> list = new ArrayList<StringBuilder>();
ArrayList<Integer> alist = new ArrayList<Integer>();
// add some elements ti list
list.add(new StringBuilder("hello"));
list.add(new StringBuilder("2"));
list.add(new StringBuilder("hi"));
list.add(new StringBuilder("this"));
// add some elements to alist
alist.add(4);
alist.add(9);
//get method
StringBuilder a = list.get(3);
a.append(" is a good day");
int b = alist.get(1);
b = 7;
// print the list
System.out.println("LinkedList:" + list);
System.out.println("ArrayList:" + alist);
y el resultado está aquí
LinkedList:[hello, 2, hi, this is a good day]
ArrayList:[4, 9]
Parece que devuelve el método get una copia superficial del elemento de la lista (en el caso de StringBuilder) a la una, pero devuelve una copia profunda (en el caso de entero) en el b! ¿porqué sucedió? Do el método get devuelve una copia profunda o superficial de los elementos de la lista?
get
devuelve una referencia al List
elemento, no una copia (ni profunda ni superficial).
En el primer fragmento que mutar el objeto referenciado por la variable a
, por lo que el List
también se ve afectada:
StringBuilder a = list.get(3);
a.append(" is a good day");
En el segundo fragmento se asigna un nuevo valor a la variable b
, que no afecta a la List
:
int b = alist.get(1);
b = 7;
Para que el primer fragmento de comportarse como el segundo, debe escribir:
StringBuilder a = list.get(3);
a = new StringBuilder(" is a good day");
y List
no se verán afectados.
Por otro lado, no se puede hacer el segundo fragmento se comportan como el primero. Incluso si ha asignado el List
elemento a una Integer
variable que no se puede llamar a cualquier método que mutan, ya que Integer
es inmutable.