Partage
  • Partager sur Facebook
  • Partager sur Twitter

Hashcode

Sujet résolu
    18 juillet 2021 à 0:12:53

    Bonjour,

    J'ai une petite question. Dans le code suivant :

    public class Testi {
    	
    	protected String pays;
    	protected String capital;
    	
    	protected int nbreHabitants;
    	
    	
    	public Testi() {
    		System.out.println("Bonjour");
    	}
    	
    	public Testi(String pays, String capital, int nbreHabitants) {
    		this.pays=pays;
    		this.capital=capital;
    		this.nbreHabitants=nbreHabitants;
    	}
    	
    	
    	
    	public String getPays() {
    		return this.pays;
    	}
    	
    	public void setPays(String pays) {
    		this.pays=pays;
    	}
    
    	@Override
    	public int hashCode() {
    		final int prime = 31;
    		int result = 1;
    		result = prime * result + ((capital == null) ? 0 : capital.hashCode());
    		result = prime * result + nbreHabitants;
    		result = prime * result + ((pays == null) ? 0 : pays.hashCode());
    		return result;
    	}
    

    Dans la méthode "hashCode()", je ne comprends pas "capital.hashCode()" et "pays.hashCode()". À quoi ces deux instructions font appel et elles retournent quoi ? À quelle classe font-elles appel ? (Testi ou Object)

    Merci d'avance pour votre aide.

    • Partager sur Facebook
    • Partager sur Twitter
      18 juillet 2021 à 2:20:54

      Elle font appel à la méthode hashCode() fournie par capital et celle fournie par pays.

      Comme ces variables sont de type String, il s'agit là de la méthode hashCode() de la classe String.

      Note toutefois, que la méthode hashCode() est définie dans la classe java.lang.Object elle-même, c'est-à-dire dans la classe ancêtre de toutes les classes. Donc, toutes les classes en héritent, et donc la méthode hashCode() peut être appelée sur n'importe quel objet Java.

      Les classes peuvent toutefois redéfinir hashCode(), lorsque l'implémentation fournie par java.lang.Object ne convient pas. La plupart des classes redéfinissent hashCode() et devraient le faire, quand elles redéfinissent equals(). En effet, hashCode() sert à réduire un objet à un nombre, de sorte que tout objet équivalent à celui-ci aurait le même nombre. Et de préférence, que des objets non équivalents auraient des nombres différents, autant que possible. Si, donc, on redéfinit la méthode equals(), ça signifie qu'on change les règles de ce qui fait que deux objets soient considérés équivalents. Et donc, que ce changement doit être reflété dans hashCode() aussi.

      • Partager sur Facebook
      • Partager sur Twitter
        19 juillet 2021 à 12:25:32

        Bonjour
        Un grand merci pour votre réponse.


        Évidemment que le codecapital.hashCode() fait référence à la méthode hashCode de la méthode String. Je comprends pas comment j'ai fait pour ne pas le voir.

        En cherchant un peut j'ai pu trouver à quoi ressemblait la méthode hashCode() de la méthode String :

        s[0]*31^(n - 1) + s[1]*31^(n - 2) + ... + s[n - 1]
        

        Où "s[i]" fait référence au nième caractère et "n" correspond à la longueur de la chaîne de caractère. ^ indique l'exposant.

        J'ai une dernière question un peu rien à voir.

        Pour que Java convertit un caractère en nombre binaire, est-ce que d'abord il transforme le dit caractère en code Unicode (qui lui même est déjà enregistré et correspond au code binaire qui lui est associé ) ?

        ex : b = U+0062 --> 1100010

        ou le caractère est transformer en nombre décimal qui lui même est associé au bits qui lui correspondent ?

        ex : c = 99 --> 1100011


        Merci d'avance pour votre réponse.

        -
        Edité par Little Bird 19 juillet 2021 à 12:26:52

        • Partager sur Facebook
        • Partager sur Twitter
          19 juillet 2021 à 15:38:47

          En fait, les caractères sont dès le départ des nombres binaires. Ça se sait peu, mais en Java le type char est un type qui stocke des nombres (sur 16 bits, et non signé. C'est le seul type numérique de Java qui n'a pas de valeur négative). On peut les additionner sans problème, tout comme faire des trucs comme :

          char c = 65;

          Un caractère n'a donc pas besoin d'être "converti" en nombre : c'est un nombre dès le départ.

          Par contre, la question qui reste, c'est quand on a un littéral comme :

          char c = 'A';

           ou

          String s = "hello";

          Comment est-ce que le 'A' est converti en nombre pour être stocké dans un char, et comment est-ce que le "hello" est converti en une séquence de chars qui représente la String ?

          Eh bien oui, c'est Unicode qui s'applique. Un fichier source .java peut être encodé en n'importe quel encodage, mais le compilateur le décode d'abord et le voit comme une séquence de chars Java, autrement dit il décode l'encodage du fichier et le convertit en Unicode. Cela étant fait, le 'A' est donc une suite de trois codepoints unicode, dont on ne garde que celui du milieu, ce qui donne la valeur numérique à stocker dans la variable.

          Enfin, c'est Unicode qui s'applique, pour les codepoints de U+0000 à U+FFFF. Le type char n'est que sur 16 bits, il ne peut donc pas stocker les valeurs qui vont au-delà.

          String le peut, en prenant comme principe que les caractères au-delà de U+FFFF sont en fait stockés sur deux unités 16-bits, autrement dit sur deux chars. Pour cela il utilise le même principe qu'UTF-16. On peut donc dire que c'est UTF-16 qui s'applique, et que pour un char seul cela ne peut se faire qu'avec les caractères qui ne nécessitent qu'une unité UTF-16.

          • Partager sur Facebook
          • Partager sur Twitter
            23 juillet 2021 à 21:59:28

            Bonjour,

            Un grand merci pour tes réponses.

            Tout me paraît plus clair à présent.

            Je mets le sujet en "résolu".

            Merci encore.

            • Partager sur Facebook
            • Partager sur Twitter

            Hashcode

            × 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