PDA

View Full Version : [java] dubbio atroce su ArrayList


akyra
31-12-2007, 11:55
sto usando una variabile di tipo ArrayList per memorizzare una serie di oggetti di tipo stringa...
da quanto io ho sempre saputo, il metodo "add(Object o)" di ArrayList, non copia l'oggetto passato nella lista, bensì ne copia il puntatore...in questo modo se modifico l'oggetto "Object o" la modifica si ripercuote anche sull'oggetto memorizzato nella lista...


invece qua:

ArrayList lista = new ArrayList();
str = new String("CIAO");
lista.add(str);
str = "SALVE";
System.out.println(lista,get(0));


stampa "CIAO" e non "SALVE"...
dato che ho usato il meotodo "add(str)" se modifico l'oggetto "str" questa modifica si dovrebbe ripercuotere anche sugli elementi dell'arraylist...come mai in questo caso non è così?

grazie a tutti e buna fine dell'anno

banryu79
31-12-2007, 13:17
Non è così per un motivo semplice: "str" NON è un oggetto! "str" è solamente un riferimento ad un oggetto... ma a che oggetto? All'oggetto a cui sta puntando attualmente.

Ovvero: nel momento in cui nel tuo codice fai questo:

lista.add(str);


a cosa sta puntando "str"? Basta leggere la riga subito sopra che mostra l'assegnamento:


str = new String("CIAO");


Quindi nella lista, in posizione [0] viene inserito un riferimento che punta all'oggetto "CIAO".

Infatti, quando poi fai:

str = "SALVE";


NON stai modificando il riferimento memorizzato in Lista[0]... Semplicemente stai prendendo il riferimento "str" e lo stai facendo puntare ad un nuovo oggetto, "CIAO".

Puoi pensare che quando fai:

lista.add(str);


La lista si salva in quella posizione una copia del riferimento passato che quindi punta all'oggetto corrente.
Poi il riferimento "str" lo puoi anche far puntare ad altri oggetti, tanto la lista ha il suo riferimento.

Ciao :)

akyra
31-12-2007, 13:26
mi ero già risposto da solo dopo aver fatto il post, solo che ormai era troppo tardi per cancellarlo :asd:

stamattina credo di aver lasciato la testa sul cuscino

ciao e buon anno a tutti!