2011-08-26 2 views
1

J'ai 2 listes et je suis un peu confus au sujet de l'ajout d'un objet dans les deux comme ceci:Insertion d'un objet dans 2 Collections

TestClass e; 
List lst1; 
LinkedList lst2; 
... 
lst1.add(e); 
lst2.add(e); 

Will lst1 et lst2 ont des copies de e? ou la référence au même objet e?
Si le premier est vrai, comment le code peut-il faire des copies de e si TestClass n'est pas clonable?

Répondre

1

Est-ce lst1 et lst2 ont des copies de e?

Oui.

Les deux listes auront une copie de la valeur contenue dans e. (Notez cependant, que e contient une référence et non un objet réel.)

Cela signifie que

  1. Les deux listes auront une copie de chacune de la référence à l'objet TestClass qui e fait référence à au point de add.

  2. Les modifications apportées à l'objet TestClass seront visibles à partir des références des deux listes.

  3. Performing e = null après l'ajout n'affectera pas le contenu des listes (listes contiennent des copies, souvenez-vous? ;-)

+1

+1 Oui - c'est techniquement plus correct. Je pense que l'OP pensait que «e» était l'objet lui-même, alors qu'en réalité c'est l'adresse à l'objet –

2

Ils auront la même référence. Vous devrez copier manuellement les valeurs si vous voulez que ce soit 2 propriétés distinctes.

+0

Je ne pense pas que l'OP veut - plutôt simplement se demander comment cela fonctionne. –

2

La seconde est vraie: les deux collections contiendront une référence à ce même objet.

0

Cela remonte à la vieille question de passage par référence vs en passant par valeur ...

Voir ce stackoverflow question

les deux lst1 et lst2 contiendra une valeur (représentée par lavariables) qui indiquera à la machine virtuelle Java comment trouver l'instance TestClass dans la mémoire de segment. Si vous modifiez l'instance (il n'y a qu'une seule instance) en y accédant par e, lst1, ou lst2 les changements seront visibles partout!

La seule façon de modifier ce comportement est de remplacer la fonction Object clone() en TestClass et en passant à la fonction e.clone()add(...).S'il vous plaît se réfère à la documentation

Si vous ne pouvez pas modifier le TestClass pour toutes les raisons que vous pouvez également cloner l'instance par vous-même (essentiellement vous implémentez clone() en dehors TestClass). Créer une nouvelle instance TestClasse2 avec l'opérateur new puis obtenir ses variables d'instance (attention est-il contient d'autres objets personnalisés) de e à travers son « apporteurs » et définir les valeurs à e2 par ses « faiseurs ». C'est moche comme l'enfer et j'espère que vous refusez de le faire ...

Questions connexes