Pour quoi on fait int + String dans la méthode hashCode?

Résolu
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention   -  
arthurg95 Messages postés 2421 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
j'ai fait une recherche sur le net concernant ces deux notions mais j'ai toujours un problème avec leurs méthodes.

je suis en train de suivre le tutoriel de site du zéro et j'ai pas compris ce code :

public int hashCode() {
//On définit un multiplication impair, de préférence un nombre premier
//Ceci afin de garantir l'unicité du résultat final
final int prime = 31;
//On définit un résultat qui sera renvoyé au final
int result = 1;
//On ajoute en eux la multiplication des attributs et du multiplicateur
result = prime * result + categorie;
result = prime * result + nbreHabitants;
//Lorsque vous devez gérer des hashcodes avec des objets dans le mode de calcul
//Vous devez vérifier si l'objet n'est pas null, sinon vous aurez une erreur
result = prime * result + ((nomPays == null) ? 0 : nomPays.hashCode());
result = prime * result + ((nomVille == null) ? 0 : nomVille.hashCode());
return result;
}

On peut générer ce code automatiquement via le menu Source/Generate hashcode and equals.

Ce que j'ai pas compris est:
Pour quoi ce prime = 31 et result=1?
Et la question la plus importante est pour quoi ils font la somme d'un entier et un String
(int prime*result + String categorie) c'est quoi cette somme ?????????

et merci


4 réponses

arthurg95 Messages postés 2421 Date d'inscription   Statut Membre Dernière intervention   341
 
Bonjour,

Le principe d'un Hash est qu'il y en ai le moins d'identique possible pour avoir une répartition dans les tables (hashtab) par exemple quasiment égale.

Pourquoi prime = 31 ? Parce que c'est un nombre premier, tu aurais pu aussi bien mettre 37 ;)


Cette somme ne correspond à rien de concret, c'est la définition du hash ;)
A mon avis ici il utilise sont hash pour la méthode compareTo(), afin de définir la différence entre 2 villes, elle ne sont égales si et seulement si categorie=categorie, nbrHabitant = nbrHabitant, ...
Ce hash donne un identifiant unique (en théorie) à ta ville.

Mais dans tous les cas, vérifie sur categorie est bien un string, car on ne peut pas faire la somme d'un int et d'un string ;)
Tout est dit, mais comme personne n'écoute il faut toujours répéter
0
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
merci beaucoup c'est très gentil.
Si j'ai bien compris, on ne peut pas deviner result vaut combien c'est ça ?
0
arthurg95 Messages postés 2421 Date d'inscription   Statut Membre Dernière intervention   341
 
De rien ;)
Non pas du tout ! Tu peux l'afficher result même si tu veux, tu verras bien ce que ça donne ;)

Un conseil, n'essaye pas d'avancer trop vite dans le tuto en pensant avoir compris ;)
0
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour ton conseil :)
je voulais dire est ce qu'on peut deviner le résultat de hashCode avant l'exécution c'est à dire on fait les calculs juste pour vérifier, et j'ai dit "on ne peut pas" parce qu'on a cette somme "int+String" c ça le problème pour moi
0
arthurg95 Messages postés 2421 Date d'inscription   Statut Membre Dernière intervention   341
 
Ah c'est bien ce qui me semblait, categorie n'est pas un String, mais un char.
En fait un char, il est interprété par le code ASCII de la lettre, un "A" vaut 65 par exemple ;)
0
estrellas6 Messages postés 36 Date d'inscription   Statut Membre Dernière intervention  
 
oui c vrais c'est un char donc il va nous donner 96 pour cette ligne
ok merci beaucoup :)
0
arthurg95 Messages postés 2421 Date d'inscription   Statut Membre Dernière intervention   341
 
De rien, passe en résolu ;)
0