Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1476 connectés 

  FORUM HardWare.fr
  Programmation
  Java

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1349871
ikao2
okaïdi okaïda
Posté le 19-04-2006 à 17:00:03  profilanswer
 

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
mood
Publicité
Posté le 19-04-2006 à 17:00:03  profilanswer
 

n°1349931
Taz
bisounours-codeur
Posté le 19-04-2006 à 17:34:43  profilanswer
 

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.

n°1349959
ikao2
okaïdi okaïda
Posté le 19-04-2006 à 18:02:04  profilanswer
 

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
n°1349961
blaise_lap​orte
Posté le 19-04-2006 à 18:04:29  profilanswer
 

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

n°1349969
ikao2
okaïdi okaïda
Posté le 19-04-2006 à 18:22:55  profilanswer
 

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
n°1349972
blaise_lap​orte
Posté le 19-04-2006 à 18:27:53  profilanswer
 

trés clair.
 
Merci!


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

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

 

Sujets relatifs
Creation de familles d'objetconversion HTML vers PDF
creation des instrances d'objet contexte Probleme ?[java3D] detecter la position d'un objet.
Conversion String en Hexa ("1F") vers byteConseil sdd à adopter pour couples objet/références vers cet objet
[perl]: copie fichier1 vers fichier2 sauf le débutFormulaire HTML vers PHP
[C++] Pb de link avec VTK4.2.2 et la STL - undefined reference !! 
Plus de sujets relatifs à : Une Map/List contient-elle une "référence vers" ou l'objet lui même ?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR