comprendre
Le but de HashCode () est d'obtenir le code de hachage, également connu sous le nom de code de hash; Il renvoie en fait un INT INTEGER. La fonction de ce code de hachage consiste à déterminer la position d'index de l'objet dans la table de hachage.
HashCode () est défini dans Object.Java de JDK, ce qui signifie que toute classe de Java contient la fonction hashcode ().
Cependant, chaque classe Java contient une fonction HashCode (). Cependant, le HashCode () de la classe n'est utile que lors de la création et de la création d'une "table de hachage" (voir la description ci-dessous pour "Tableau de hash") (la fonction consiste à déterminer la position de chaque objet de la classe dans la table de hachage; dans d'autres cas (par exemple, à créer un seul objet de la classe, ou à créer un tableau d'objets de la classe, etc.), le HashCode () de la classe Hashcode () n'a pas d'effet.
La liste de hachage ci-dessus fait référence à: les classes dans les collections Java qui sont essentiellement des listes de hachage, telles que HashMap, Hashtable et HashSet.
En d'autres termes: HashCode () n'est utile que dans les hachats, mais est inutile dans d'autres cas. La fonction de HashCode () dans une table de hachage est d'obtenir le code de hachage de l'objet, puis de déterminer la position de l'objet dans la table de hachage.
Nous savons tous qu'une table de hachage stocke les paires de valeurs clés, qui sont caractérisées par: il peut rapidement récupérer les "valeurs" correspondantes en fonction des "clés". Cela utilise le code de hachage!
L'essence d'une table de hachage est mise en œuvre via un tableau. Lorsque nous voulons obtenir une certaine "valeur" dans une table de hachage, nous voulons réellement obtenir l'élément à une certaine position dans le tableau. La position du tableau est obtenue par "clé"; De plus, la position du tableau est calculée par le code de hachage correspondant à la "clé".
Ci-dessous, nous prendrons Hashset comme exemple pour expliquer en profondeur le rôle de HashCode ().
Supposons qu'il y ait déjà 1000 éléments dans le hashset. Que dois-je faire lors de l'insertion du 1001e élément? Étant donné que HashSet est une collection de sets, il permet des éléments en double.
"Comparez le 1001e élément un par un avec les 1000 éléments précédents"? De toute évidence, cette efficacité est tout aussi inefficace. La table de hachage résout très bien ce problème. Il calcule la position de l'élément dans la table de hachage en fonction du code de hachage, puis insère l'élément dans cette position. Pour le même élément, naturellement, un seul est sauvé.
De cela, nous pouvons voir que si deux éléments sont égaux, leurs codes de hachage doivent être égaux; Mais l'inverse ne l'est pas. Dans une table de hachage,
1. Si deux objets sont égaux, alors leurs valeurs HashCode () doivent être les mêmes;
2. Si les deux objets HashCode () sont égaux, ils ne sont pas nécessairement égaux.
Remarque: c'est le cas dans les tables de hachage. Cela doit être vrai dans les listes non de hachage!
Exemple
Jetons un coup d'œil à un exemple spécifique.
classe publique HashTest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int hashcode () {return i% 10; } public final static void main (String [] args) {hashTest a = new HashTest (); HashTest b = new hashtest (); a.seti (1); b.seti (1); Set <shTest> set = new HashSet <Shtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (a.equals (b)); System.out.println (set); }}Le résultat de cette sortie:
Vrai Faux [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
Dans l'exemple ci-dessus, nous réécrivons simplement la méthode HashCode. D'après les résultats ci-dessus, nous pouvons voir que bien que les codes de hash des deux objets soient égaux, les deux objets ne sont en fait pas égaux;, nous n'avons pas réécrit la méthode égale, puis nous appellerons la méthode égale par défaut de l'objet pour comparer si les références des deux objets sont définitivement incertaines. Ici, nous mettons l'objet généré dans le hashset, et seul l'objet unique peut être stocké dans le hashset, c'est-à-dire que le même objet (applicable à la méthode égaux) n'en stockera qu'un, mais ici, il y a en fait deux objets A et B qui sont placés dans le hashset, donc le hashset perd sa propre signification.
Pour le moment, nous ajoutons la méthode égaux:
classe publique HashTest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "Color: # 3366FF;"> <strong> public booléen equals (objet objet) {if (object == null) {return false; } if (object == this) {return true; } if (! (instance d'objetof hashtest)) {return false; } HashTest Autre = (HashTest) Objet; if (autre.geti () == this.geti ()) {return true; } return false; } </strong> </span> public int hashcode () {return i% 10; } public final static void main (String [] args) {hashTest a = new HashTest (); HashTest b = new hashtest (); a.seti (1); b.seti (1); Set <shTest> set = new HashSet <Shtest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == b.hashcode ()); System.out.println (a.equals (b)); System.out.println (set); }}Les résultats obtenus pour le moment seront les suivants:
Vrai True [com.ubs.sae.test.hashtest@1]
D'après les résultats, nous pouvons voir que les deux objets sont désormais complètement égaux, et un seul objet est stocké dans le Hashset.
Résumer
1. L'existence de HashCode est principalement utilisée pour la recherche de solidité, telle que le hashtable, le hashmap, etc. HashCode est utilisé pour déterminer l'adresse de stockage d'un objet dans la structure de stockage de hachage;
2. Si les deux objets sont les mêmes, il est applicable à la méthode égaux (java.lang.object), alors les codes de hash de ces deux objets doivent être les mêmes;
3. Si la méthode égale de l'objet est réécrite, le HashCode de l'objet doit également être réécrit autant que possible, et l'objet utilisé par HashCode doit être cohérent avec le même que la méthode égale, sinon elle violera le deuxième point mentionné ci-dessus;
4. Le code hashcode de deux objets est le même, ce qui ne signifie pas nécessairement que les deux objets sont les mêmes, c'est-à-dire qu'il ne s'applique pas nécessairement à la méthode égaux (java.lang.object). Il peut seulement indiquer que ces deux objets sont dans une structure de stockage de hachage, comme le hashtable, et ils sont "stockés dans le même panier".