Partage
  • Partager sur Facebook
  • Partager sur Twitter

HashCode-Equals-toString

Sujet résolu
    28 juillet 2015 à 17:51:39

    Bonjour à vous,

    J'aurais une petite question à vous poser. J'ai cherché sur internet une explication assez simple mais bon en vain...

    J'aimerais savoir pourquoi devons nous redéfinir les méthodes Hascode / Equals et toString. J'ai bien compris à quoi servait ces méthodes mais pourquoi redéfinir ces méthodes reste très flou pour moi.

    J'ai compris que toString retourne une chaine de caractère donc que nous pouvions remplacer une méthode qui retourne une chaine de caractère par toString et que ce dernier faisait appel à Object...

    Je vous remercie d'avance pour vos réponses.

    • Partager sur Facebook
    • Partager sur Twitter
      28 juillet 2015 à 18:46:19

      Bonjour.

      La méthode toString() est facultative : je n'ai jamais vu de spécification se basant sur cette méthode.
      Donc pour moi c'est uniquement pour t'afficher une valeur lisible et explicites lors du debug : logs, tests, debugueur, ...

      La méthode equals() est très utilisée, c'est ce qui permet de comparer les valeurs : obj1.equals(obj2), liste.contains(obj), ...
      J'imagine que tu n'as pas eu de mal à comprendre cela.

      La méthode hashCode() est utilisées par les tables de hashage.
      C'est une structure de données très utilisée en programmation, je t'invite à te documenter sur internet sur leur fonctionnement. Pour résumer : c'est comme un livre, où l'index (la 1ère page) stocke une clé (le hash) qui redirige vers un ensemble d'éléments semblables (même hash), et la recherche se fait à l'intérieur de cet ensemble via l'égalité (equals()).
      Cela implique une règle mathématiques très importante : obj1=obj2 => hash(obj1)=hash(obj2)
      Ainsi comme les 2 méthodes sont liées, redéfinir l'une implique de redéfinir l'autre.

      • Partager sur Facebook
      • Partager sur Twitter
      Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
        28 juillet 2015 à 20:30:03

        Bonjour Monsieur et merci pour votre réponse,

        Une dernière petite question et je pense que j'aurais fini sur ce chapitre ^^

        public boolean equals(Object obj) {
        		  //On vérifie si les références d'objets sont identiques
        		  if (this == obj)
        		    return true;
        
        		  //On s'assure que les objets sont du même type, ici de type Ville
        		  if (getClass() != obj.getClass())
        		    return false;
        			
        		  //Maintenant, on compare les attributs de nos objets
        		  Ferme1 other = (Ferme1) obj;
        
        		  return Objects.equals(other.getTaille(), this.getTaille());
        		}

        Je ne comprends pas pourquoi il y a le "this" pour "if (this == obj)"...


        Merci à vous.

        • Partager sur Facebook
        • Partager sur Twitter
          28 juillet 2015 à 21:13:50

          this désigne l'objet courant.
          Si l'on voulait faire une méthode statique pour comparer 2 objets (par exemple equals(obj1, obj2) ) et bien cela équivaudrait à if (obj1, obj2)...

          Je ne sais pas où tu as trouvé cette implémentation mais elle ne respecte pas la spécification : si obj est null alors elle doit retourner false, or ici à la ligne 7 un NullPointerException sera levé.

          class Foo {
              @Overrides
              public boolean equals(Object obj) {
                  if (obj == null) return false;
                  if (getClass() != obj.getClass()) return false;
                  Foo other = (Foo) obj;
                  // comparaison...
              }
          }
          • Partager sur Facebook
          • Partager sur Twitter
          Angular 2 est l'avenir, jQuery c'est de la merde !!! - Java 8 c'est l'an 2016+ (programmez en 1 ligne)
            30 juillet 2015 à 14:14:36

            Je te remercie pour tout, c'est très gentil d'avoir pris du temps pour m'expliquer.

            Bonne journée à toi.

            • Partager sur Facebook
            • Partager sur Twitter

            HashCode-Equals-toString

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown