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

Java Discussion :

hashCode() et l'adresse memoire


Sujet :

Java

  1. #1
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut hashCode() et l'adresse memoire
    Bonjour,

    Je reviens vers vous avec une question dans les fondamentaux du Java,

    J'ai lu dans la Javadoc que la méthode toString() s'elle n'est pas redéfinie dans un objet, elle retourne le nom de la classe + "@" + l'emplacement mémoire : http://docs.oracle.com/javase/7/docs...toString%28%29.

    Et j'ai dans d'autres articles que n'est pas à 100% vrai, toString() retournera le nom de classe + "@" + le hashCode() convertie en hexadécimale.

    Je voudrais savoir qu'elle est la liaison entre le hashCode et l'adresse mémoire ? et ainsi comprendre la bonne définition de la méthode toString() de la classe Object.

    Si c'est bien l'adresse mémoire de l'objet qui est affiché, pourquoi on redéfinissant le hashCode() d'un objet, la valeur hexa qui suit le "@" ne change pas même en changeant de machine ??!!

    Merci par avance de votre retour.

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 608
    Points
    21 608
    Par défaut
    Citation Envoyé par aelmalki Voir le message
    J'ai lu dans la Javadoc que la méthode toString() s'elle n'est pas redéfinie dans un objet, elle retourne le nom de la classe + "@" + l'emplacement mémoire : http://docs.oracle.com/javase/7/docs...toString%28%29.
    Clique sur ce lien. Personne n'y parle d'emplacement mémoire. On n'y parle que du hashCode() affiché en hexadécimal.

    Citation Envoyé par aelmalki Voir le message
    Et j'ai dans d'autres articles que n'est pas à 100% vrai, toString() retournera le nom de classe + "@" + le hashCode() convertie en hexadécimale.
    En fait c'est toujours ce qui se passe, ni plus ni moins.

    Citation Envoyé par aelmalki Voir le message
    Je voudrais savoir qu'elle est la liaison entre le hashCode et l'adresse mémoire ?
    Il n'y en a pas, c'est une légende urbaine.
    Cette légende vient du fait que les gens qui la colportent ne savent pas ce que renvoie Object.hashCode(), et ils se figurent que ça renvoie "l'emplacement mémoire" de l'objet. Non, ça renvoie un hachage de "l'adresse interne" de l'objet. Mais "l'adresse interne" est un concept Java qui n'est pas lié à l'emplacement mémoire.
    C'est vrai que d'une certaine manière, on peut s'en servir d'information de débogage, comme on se sert d'un emplacement mémoire comme information de débogage. Mais c'est autre chose. C'est un identifiant.

    Citation Envoyé par aelmalki Voir le message
    et ainsi comprendre la bonne définition de la méthode toString() de la classe Object.
    Pour quoi faire ? Si c'est pour essayer de lire correctement une stacktrace à l'œil nu, ok, c'est bien.
    Si c'est pour appeler toString() sur un objet et analyser la chaîne construite, c'est débile. Tu peux faire plus simple.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre habitué Avatar de aelmalki
    Inscrit en
    Mars 2009
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 250
    Points : 125
    Points
    125
    Par défaut
    Bonjour,

    Merci pour votre réponse,

    Effectivement, je me suis trompé de lien où il parle de l'adresse mémoire, et ce n'est pas la Javadoc, désolé.

    Je suis d'accord avec vous que ça ne sert à rien de lire la chaîne, d’ailleurs on redéfinissant toString(), c'est plus simple de montrer des valeurs d'attributs que de code hexa avec le nom complet de la classe, je voulais posé cette question juste pour savoir si par hasard il existe un lien entre hashCode et l'@ memoire.

    Merci pour vos explications.

  4. #4
    Membre chevronné
    Inscrit en
    Mai 2006
    Messages
    1 364
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 1 364
    Points : 1 984
    Points
    1 984
    Par défaut
    Pour t'en convaincre, il suffit de regarder le code source de la classe object :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public String toString() {
    	return getClass().getName() + "@" + Integer.toHexString(hashCode());
        }
     
    public boolean equals(Object obj) {
    	return (this == obj);
        }
    Donc on a bien l'affichage du hashcode dans toString.

    Il faut aussi comprendre que le hashcode est utilisé dans les hashtables et compagnie et, pour etre performant, il faut qu'il soit différent aussi souvent que possible pour 2 objets inegaux. Comme la classe object implémente la fonction equals la plus discriminante possible (vrai que si on teste 2 fois le meme objet), il est pratique d'utiliser l'adresse mémoire (ou bien un hash de celle-ci) afin d'obtenir le hashcode.

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

Discussions similaires

  1. Adresse memoire de structure
    Par andrebernard dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 16/09/2010, 09h29
  2. adresse memoire attribut
    Par captu dans le forum Langage
    Réponses: 2
    Dernier message: 25/05/2009, 17h26
  3. Consulter adresse memoire
    Par Statoonus dans le forum C#
    Réponses: 1
    Dernier message: 17/04/2008, 18h53
  4. Adresse memoire d'une fonction
    Par Hitchigo dans le forum Delphi
    Réponses: 5
    Dernier message: 30/07/2006, 12h37
  5. l'adresse memoire d'un dll ?
    Par ilimo dans le forum Windows
    Réponses: 12
    Dernier message: 08/04/2006, 22h24

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