web-dev-qa-db-fra.com

Ajouter un objet à une ArrayList et le modifier plus tard

Si j'ai un ArrayList et que j'y ai ajouté un objet, puis que j'ai modifié cet objet, cette modification sera-t-elle prise en compte dans ArrayList? ou lorsque j'ajoute l'objet à ArrayList, Java crée une copie et l'ajoute à ArrayList?

Et si je change la référence à cet objet en null? Est-ce que cela signifie que l'objet dans ArrayList est maintenant également nul?

57
K''

cette modification sera-t-elle reflétée dans la liste de tableaux?

Oui, puisque vous avez ajouté une référence à l'objet de la liste. La référence que vous avez ajoutée désignera toujours le même objet (que vous avez modifié).


ou lorsque j'ajoute l'objet à ArrayList, Java crée une copie et l'ajoute à ArrayList?

Non, il ne copiera pas l'objet. (Cela copiera la référence à l'objet.)


Et si je change la référence à cet objet en null? Est-ce que cela signifie que l'objet de la liste ArrayList est désormais nul?

Non, car le contenu de la référence d'origine était copié lors de l'ajout à la liste. (N'oubliez pas que c'est la référence qui est copiée, pas l'objet.)

démonstration:

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]
75
aioobe

Toute modification de l'objet sera reflétée dans la liste.

Toutefois, lorsque vous traitez avec des objets tels que Strings qui sont immuables, un nouvel objet est créé lors des "opérations de modification". En réalité, votre ancien objet est toujours dans la liste et vous en avez un autre ailleurs.

4
DerMike

Merci à tous les gars. Je l'ai compris à nouveau en lisant vos messages. C'est probablement un concept déroutant, car je l'ai fait digérer il y a longtemps, mais récemment, j'ai oublié comment cela fonctionne à nouveau. Je veux donc partager la clé qui résout le problème pour moi. (notez que les objets non primitifs (les primitives sont int, boolean, etc.) en Java sont des pointeurs techniques). Lorsque vous ajoutez le objet o à une liste, la liste et le o indiquent la même chose. Ainsi, lorsque vous modifiez o le point de la liste change. C’est aussi long qu’ils pointent vers la même chose et se cassent lorsque o indique quelque chose d’autre de = .

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

ou

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)

j'espère que ça aide quelqu'un

0
navid