33 votes

Pourquoi le code de hachage de différentes instances booléennes est toujours le même ?

Dans le code ci-dessous, le code de hachage est toujours le même. Pourquoi est-ce que c'est comme ça ?

Code :

public class BooleanClass {

    public static void main(String[] args) {
        Boolean b1 = new Boolean(true);
        Boolean b2 = new Boolean(false);
        Boolean b3 = new Boolean(true);
        Boolean b4 = new Boolean(false);
        Boolean b5 = new Boolean(false);
        Boolean b6 = new Boolean(true);

        System.out.println(b1.hashCode());
        System.out.println(b2.hashCode());
        System.out.println(b3.hashCode());
        System.out.println(b4.hashCode());
        System.out.println(b5.hashCode());
        System.out.println(b6.hashCode());
    }
}

Sortie :

1231
1237
1231
1237
1237
1231

Toujours les mêmes chiffres 1231 y 1237 sont imprimés. Une raison ?

159voto

Gokul Nath Points 4157

Le JavaDoc de Boolean.hashCode() méthode dit :

Renvoie le nombre entier 1231 si cet objet représente true ; renvoie le nombre entier 1237 si cet objet représente false .

51voto

Harmlezz Points 3632

Le contrat pour hashCode() est :

Si deux objets sont égaux selon la equals(Object) puis en appelant la méthode hashCode() sur chacun des deux objets doit produire le même résultat entier.

Et alors que le booléen n'a que deux valeurs, true y false vous n'obtenez que deux codes de hachage différents.

20voto

Shekhar Points 566

Directement de la classe booléenne :

 public int hashCode()
 {
   return ((this.value) ? 1231 : 1237);
 }

C'est la méthode qui permet de générer un code de hachage pour le type booléen. C'est pourquoi vous obtenez toujours le même code de hachage pour true ou false.

et ceci est le constructeur du booléen

 public Boolean(boolean paramBoolean)
 {
   this.value = paramBoolean;
 }

donc cette valeur sera soit vraie soit fausse si vraie elle donnera 1231 et si fausse elle donnera 1237

11voto

Josh Roberts Points 390

Le but d'une fonction de hachage est de faire correspondre des données de longueur arbitraire à des données de longueur fixe. Les valeurs renvoyées par une fonction de hachage sont appelées valeurs de hachage, codes de hachage, sommes de hachage, sommes de contrôle ou simplement hachages. Une fonction de hachage renverra toujours exactement la même valeur de hachage si l'entrée est identique, d'où le hachage. true sera toujours égal à 1231 et le hachage false sera toujours égal à 1237

5voto

keshlam Points 5979

Si vous avez vraiment besoin de distinguer des instances plutôt que des valeurs -- ce qui est TRÈS rarement ce que vous voulez réellement, mais cela arrive occasionnellement -- voir IdentityHashMap .

(Essentiellement, IdentityHashMap contourne à la fois le .equals() y .hashcode() dans la classe "réelle" de l'objet et utilise celles de la classe "réelle" de l'objet. Object .)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X