IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Un hashmap de pointeurs ?


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut Un hashmap de pointeurs ?
    Bonjour à tous,

    Venant de C++, il y a un comportement que je ne m'explique pas.
    Je veux bien comprendre qu'on a plus à se soucier des pointeurs, mais pourquoi est ce que ce code… :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Integer test = null;
    propertyMap.put("int", test); //propertyMap est une hashtable d'Object
     
    System.out.println(test);
    System.out.println(propertyMap.get("int"));
     
    test = new Integer(10);
     
    System.out.println(test);
    System.out.println(propertyMap.get("int"));
    …me renvoie ceci :

    ?

    C'est certainement que quelque chose m'échappe, ce doit être normal, mais je ne comprend pas pourquoi je n'obtiens pas ceci :

    Une âme charitable pour m'expliquer ce comportement ? J'ai tenté des recherches sur le net, mais rien de fructueux…

    Merci beaucoup !

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 156
    Par défaut
    Salut,

    Je pense que cela vient du fait que quand tu ajoute ton objet test dans ta Hashtable, il recrée une nouvelle instance de l'objet. Cela induit que ton objet test est indépendant de l'objet que tu as dans ta Hashtable et donc quand tu change le premier le deuxième ne change pas et reste à null

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    Merci pour vos réponses

    @Billy14 + divxdede > Oui oui, c'est bien ce que j'ai interprété. Mais j'aimerais justement faire une affectation de l'instance et non une copie.

    @Deadpool > Oops, j'ai écrit hashtable dans le commentaire, mais il s'agissait bien d'une hashmap (comme l'indiquait l'intitulé du topic) !

    Il n'existe donc pas de moyen simple pour créer une map d'instances sans copie ?
    Comme solution intermédiaire, je vais écrire une classe template Property ayant un champ String et un autre T. Mais bon, j'ai un peu l'impression de réinventer la roue…

  4. #4
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Tu peu effectivement passer par une classe intermediaire comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    /**
     *
     * 
     */
    public class MutableReference<T>  {
     
        /** reference holded
         */
        private T referent = null;
     
        /** Creates a new instance of MutableReference */
        public MutableReference(T ref) {
            this.referent = ref;
        }
     
        public T get() {
            return referent;
        }
     
        public void set(T referent) {
            this.referent = referent;
        }
     
        public void clear() {
            this.referent = null;
        }
     
        public String toString() {
            if( get() == null ) return "null";
            return get().toString();
        }
     
     
        public static void main(String[] args) {
     
            Map<String,MutableReference<Integer>> propertyMap = new HashMap<String,MutableReference<Integer>>();
     
            MutableReference<Integer> test = new MutableReference<Integer>(null);
            propertyMap.put("int", test); //propertyMap est une hashtable d'Object
     
            System.out.println(test);
            System.out.println(propertyMap.get("int"));
     
            test.set( new Integer(10) );
     
            System.out.println(test);
            System.out.println(propertyMap.get("int"));
        }
    et tu obtient bien


  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 142
    Par défaut
    Super, c'est bien mieux que ce que je m'apprêtais à faire

    Merci beaucoup !

    (C'est utile que je hurle C++ powa, ou c'est bon, j'me suis fait suffisamment comprendre ? )

  6. #6
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par three minute hero Voir le message
    (C'est utile que je hurle C++ powa, ou c'est bon, j'me suis fait suffisamment comprendre ? )
    Non car cela impliquerait qu'on se tape des constructeurs de copies et des copies de protection à tout bout de champ

    a++

  7. #7
    Membre éprouvé
    Avatar de Deadpool
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    1 312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 1 312
    Par défaut
    Ben tu affecte une nouvelle référence à ta variable test tandis que la Hashtable pointe encore sur l'ancienne, c'est un comportement logique.

    En revanche considère le cas suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    StringBuffer test = new StringBuffer("abc");
    		Hashtable propertyMap = new Hashtable();
    		propertyMap.put("str", test); //propertyMap est une hashtable d'Object
     
    		System.out.println(test);
    		System.out.println(propertyMap.get("str"));
     
    		test.append("cde");
     
    		System.out.println(test);
    		System.out.println(propertyMap.get("str"));
    qui renvoie ceci.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    abc
    abc
    abccde
    abccde

    Ici on a utilisé une méthode d'altération de ce fait le changement effectué sur la variable test est répercuté dans la hashtable.

    PS: au passage, Hashtable est une vieillerie de Java 1.0 qu'il ne faudrait plus utiliser.

    A la place on utilise traditionnellement une HashMap.

  8. #8
    Membre émérite
    Avatar de divxdede
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    525
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Avril 2004
    Messages : 525
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Integer test = null;
    propertyMap.put("int", test); //propertyMap est une hashtable d'Object
    A ne pas confondre variables et objets !!

    test est une variable (une zone mémoire contenant l'adresse mémoire vers un objet).
    Dans le code précedent, la variable contient null, c'est à dire qu'elle ne réference aucun objet.

    Quand tu insères dans ta Map l'association "int"/test, la map utilises ces propres variables.
    De plus en java lorsque tu appelles une méthode comme put(...), les variables sont passées par valeur (C'est à dire que les parametres sont des nouvelles variables differentes de celles passées en parametre par l'appelant) dont le contenu à été recopié.

    La map à donc associé null à la clé "int" quoique tu fasses aprés de ta variable test.

    Je ne sais pas si j'ai été clair...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. pointeurs
    Par ghost74 dans le forum C
    Réponses: 3
    Dernier message: 14/12/2002, 02h52
  2. Pointeur vers un tableau
    Par Nikos dans le forum C
    Réponses: 3
    Dernier message: 09/12/2002, 00h43
  3. [Turbo Pascal] Allocation et désallocation de pointeurs dans une fonction
    Par neird dans le forum Turbo Pascal
    Réponses: 13
    Dernier message: 17/11/2002, 20h14
  4. djgpp et pointeurs far -2
    Par elvivo dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 29/07/2002, 22h43
  5. djgpp et pointeurs far
    Par elvivo dans le forum C
    Réponses: 2
    Dernier message: 13/07/2002, 00h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo