Une Map/List contient-elle une "référence vers" ou l'objet lui même ?

Une Map/List contient-elle une "référence vers" ou l'objet lui même ? - Java - Programmation

Marsh Posté le 19-04-2006 à 17:00:03    

Bonjour,
 
C'est une question basique que je viens de me poser, mais la réponse est trés importante pour moi.
 
Prenons le code suivant :
 
(UnObjet est une classe dont le constructeur instancie une variable d'instance "name", accessible et modifiable grâce à getName() et setName() )
 

Code :
  1. //
  2.   UnObjet objun = new UnObjet("objun" );
  3.   UnObjet objdeux = new UnObjet("objdeux" );
  4.   UnObjet objtrois = new UnObjet("objtrois" );
  5.   UnObjet objunbis = objun; // "passage par référence" avant de "mettre" l'objet dans un conteneur
  6.   objunbis.setName("objunbis" );
  7.   ArrayList l = new ArrayList(3);
  8.   l.add(objun);
  9.   l.add(objdeux);
  10.   l.add(objtrois);
  11.   HashMap h = new HashMap();
  12.   h.put("un",objun);
  13.   h.put("deux",objdeux);
  14.   h.put("trois",objtrois);
  15.   System.out.println( ( (UnObjet) l.get(0) ).getName() ); //objunbis
  16.   System.out.println( ( (UnObjet) l.get(1) ).getName() ); //objdeux
  17.   System.out.println( ( (UnObjet) l.get(2) ).getName() ); //objtrois
  18.   System.out.println( ( (UnObjet) h.get("un" ) ).getName() );    //objunbis
  19.   System.out.println( ( (UnObjet) h.get("deux" ) ).getName() ); //objdeux
  20.   System.out.println( ( (UnObjet) h.get("trois" ) ).getName() ); //objtrois
  21. // jusqu'ici, c'est logique (pour moi)
  22.   UnObjet objdeuxbis = objdeux; // toujours un "passage par référence" mais après avoir mis l'objet dans un conteneur
  23.   objdeuxbis.setName("objdeuxbis" );
  24.   objtrois=null; // je "supprime" le contenu de mon objet
  25.   //System.out.println( objun.getName() );
  26.   System.out.println( ( (UnObjet) l.get(0) ).getName() ); //objunbis
  27.   System.out.println( ( (UnObjet) l.get(1) ).getName() ); //objdeuxbis
  28.   System.out.println( ( (UnObjet) l.get(2) ).getName() ); //objtrois  <-------------------- là jene comprends pas ?
  29.   System.out.println( ( (UnObjet) h.get("un" ) ).getName() ); //objunbis
  30.   System.out.println( ( (UnObjet) h.get("deux" ) ).getName() ); //objdeuxbis
  31.   System.out.println( ( (UnObjet) h.get("trois" ) ).getName() ); //objtrois <------------------ là je ne comprends pas ?


 
 
Donc mon problème, c'est que tout semble se dérouler comme si la HashMap et la ArrayList contenaient des références vers les objets (puisque lorsque l'on modifie ces objets, l'affichage des objets récupérés dans les conteneurs est elle aussi modifiée) mais lorsque je met un objet à null, cela ne semble pas déranger mes conteneurs plus que ca...
 
En clair, ma question est : les conteneurs de type Map et List contiennent ils une copie de l'objet où une référence vers cet objet ? C'est important, je n'ai pas envie de faire des doublons et d'exploser la mémoire...
 
Si quelqu'un pouvait me dire ce qu'il en sait :-)
 
Merci !  :hello:


Message édité par ikao2 le 19-04-2006 à 17:01:22
Reply

Marsh Posté le 19-04-2006 à 17:00:03   

Reply

Marsh Posté le 19-04-2006 à 17:34:43    

Tu ne manipules tes objets que via des références en java. Donc ce que tu vois est tout à fait normal.
 
Quelques pistes :
- être Cloneable (pour faire une copie, et la modifier)
- être immutable (ne peux être modifer). Tu instancies donc à chaque fois une nouvelle instance avec en paramètre du constructeur de nouvelles valeurs.

Reply

Marsh Posté le 19-04-2006 à 18:02:04    

Ok je venais de trouver :
 
Un objet est un espace mémoire sur lequel vient pointer une référence. Tout n'est donc que référence vers une même zone mémoire. (quand on parle du même objet bien entendu). C'est évident maintenant que je le sais :p et ma question me paraît bien bête  :-/
 
Merci pour les pistes, ca pourrait m'être utile !


Message édité par ikao2 le 19-04-2006 à 18:02:23
Reply

Marsh Posté le 19-04-2006 à 18:04:29    

Oui, mais alors pourquoi quand il met un objet à null, cela ne se voit pas dans l'ArrayList et la HashMap?

Reply

Marsh Posté le 19-04-2006 à 18:22:55    

Bon, imaginons que "Mr objun" pointes du doigt sur un objet autour de lui.
 

Code :
  1. UnObjet objun = new UnObjet("objun" );


 
Après, quelqu'un dit à "Mr List" : regarde "Mr objun" et fais comme lui dans ta première case libre.
 

Code :
  1. l.add(objun);


 
Ensuite, on dit à "Mr objun" : arrête de pointer du doigt, c'est mal élevé.
 

Code :
  1. objun=null;


 
Au final, "Mr Tableau" pointera toujours vers l'objet.
 
Est-ce clair ?
 
L'objet n'est pas touché en lui même, c'est un jeu de pointeurs. Et dès qu'un objet cesse d'être pointé, il est tout malheureux donc il part avec le Garbage Collector.


Message édité par ikao2 le 19-04-2006 à 18:26:41
Reply

Marsh Posté le 19-04-2006 à 18:27:53    

trés clair.
 
Merci!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed