hashCode()
est utilisé pour obtenir le code de hachage, également appelé code de hachage , il renvoie en fait un int. Le but de ce code de hachage est de déterminer la position d'index de l'objet dans la table de hachage. hashCode()
的作用是获取哈希码,也称为散列码,它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。
hashCode()
定义在JDK的Object.java中,这就意味着Java中的任何类都包含有 hashCode()
函数。
散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)。
在我们编写程序的过程中,判断两个对象是否相同是十分常见且经常面对的一个问题。而 hashCode()
方法就是用来提升比较两个对象的速度的。
我们就以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:
当你把对象加入 HashSet
时,HashSet 会先计算对象的 hashcode
值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode
值作比较,如果没有相符的 hashcode
, HashSet
会假设对象没有重复出现。
但是如果发现有相同 hashcode
值的对象,这时会调用 equals()方法来检查 hashcode
相等的对象是否真的相同。如果两者相同, HashSet
就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。
这样我们就大大减少了 equals
的次数,相应就大大提高了执行速度。
Java 对于 eqauls() 方法和 hashCode() 方法是这样规定的:
同一对象上多次调用 hashCode() 方法,总是返回相同的整型值。
如果 a.equals(b),则一定有 a.hashCode() 一定等于 b.hashCode()。
如果 !a.equals(b),则 a.hashCode() 不一定等于 b.hashCode()。此时如果 a.hashCode() 总是不等于 b.hashCode(),会提高 hashtables 的性能。
a.hashCode()==b.hashCode() 则 a.equals(b) 可真可假
a.hashCode()!= b.hashCode() 则 a.equals(b) 为假。
上面结论简记:
如果两个对象 equals,Java 运行时环境会认为他们的 hashCode 一定相等。
如果两个对象不 equals,他们的 hashCode 有可能相等。
如果两个对象 hashCode 相等,他们不一定 equals。
如果两个对象 hashCode 不相等,他们一定不 equals。
我们上面讲解到 如果 两个对象 equals
的话,那么它们的 hashCode
值必然相等。如果只重写了 equals
方法,而不重写 hashCode
的方法,会造成 hashCode
的值不同,而 equals
方法判断出来的结果为true
。
在Java中的一些容器中,不允许有两个完全相同的对象,插入的时候,如果判断相同则会进行覆盖。这时候如果只重写了 equals
的方法,而不重写 hashCode
的方法,Object中 hashCode
是根据对象的存储地址转换而形成的一个哈希值。这时候就有可能因为没有重写 hashCode
hashCode()
est défini dans Object.java du JDK, ce qui signifie que toute classe en Java contient hashCode() fonction. <p></p>
<p></p>La table de hachage stocke les paires clé-valeur, et sa particularité est qu'elle peut récupérer rapidement la "valeur" correspondante en fonction de la "clé". Cela utilise des codes de hachage ! (Vous pouvez trouver rapidement l'objet dont vous avez besoin). <p></p>
<p></p>2. Pourquoi la méthode hashCode est-elle nécessaire ? <blockquote>
<p> Dans le processus d'écriture de programmes, juger si deux objets sont identiques est un problème très courant et souvent rencontré. La méthode <code>hashCode()
est utilisée pour améliorer la vitesse de comparaison de deux objets. hashcode
de l'objet pour déterminer l'emplacement où l'objet est ajouté, et le comparera également avec le hashcode
valeur des autres objets qui ont été ajoutés, s'il n'y a pas de hashcode
correspondant, HashSet
supposera que l'objet n'apparaît pas à plusieurs reprises. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Mais si un objet avec la même valeur hashcode
est trouvé, la méthode equals() sera appelée pour vérifier le hashcode Si les objets égaux sont vraiment les mêmes. Si les deux sont identiques, <code>HashSet
ne permettra pas à l'opération de jointure de réussir. S’il est différent, il sera remanié vers un autre emplacement. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#De cette manière, nous pouvons réduire considérablement le nombre de égaux
et ainsi améliorer considérablement la vitesse d'exécution. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#3. Quelle est la relation entre les méthodes hashCode() et equals() #🎜🎜##🎜🎜#Java Pour la méthode eqauls() et hashCode() ? La méthode est stipulée comme suit : #🎜🎜##🎜🎜##🎜🎜##🎜🎜# Appeler plusieurs fois la méthode hashCode() sur le même objet renvoie toujours la même valeur entière. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si a.equals(b), alors a.hashCode() doit être égal à b.hashCode(). #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si !a.equals(b), alors a.hashCode() n'est pas nécessairement égal à b.hashCode(). À ce stade, si a.hashCode() n'est toujours pas égal à b.hashCode(), les performances des tables de hachage seront améliorées. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#a.hashCode()==b.hashCode() alors a.equals(b) peut être vrai ou faux#🎜🎜##🎜🎜##🎜 🎜 ##🎜🎜#a.hashCode() ! = b.hashCode() alors a.equals(b) est faux. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Un bref résumé de la conclusion ci-dessus : #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si deux objets sont égaux, l'environnement d'exécution Java les considérera. Le hashCode doit être égal. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si deux objets ne sont pas égaux, leur hashCode peut être égal. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si les hashCode de deux objets sont égaux, ils ne sont pas forcément égaux. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Si les hashCode de deux objets ne sont pas égaux, ils ne doivent pas être égaux. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#4. Pourquoi la substitution de la méthode égale doit-elle remplacer la méthode du hashcode ? #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Nous avons expliqué plus haut que si deux objets sont égaux
, alors leurs valeurs hashCode
doivent être égales. Si vous remplacez uniquement la méthode equals
sans remplacer la méthode hashCode
, la valeur de hashCode
sera différente et equals est <code>true
. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Dans certains conteneurs en Java, deux objets identiques ne sont pas autorisés lors de l'insertion, s'ils sont jugés identiques, ils seront écrasés. À l'heure actuelle, si vous réécrivez uniquement la méthode equals
sans réécrire la méthode hashCode
, le hashCode
dans Object sera converti en fonction de l'adresse de stockage. de l'objet. Et former une valeur de hachage. À l'heure actuelle, il est possible que la méthode hashCode
ne soit pas remplacée, ce qui entraînerait le hachage du même objet à différents emplacements, ce qui entraînerait le problème de l'impossibilité d'écraser l'objet. #🎜🎜##🎜🎜##🎜🎜##🎜🎜#Par exemple#🎜🎜##🎜🎜#Classe de chien#🎜🎜#package com.xiao; /** * @author :小肖 * @date :Created in 2022/3/11 14:42 */ public class Dog { private String name; private Integer age; public Dog() { } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public Dog(String name, Integer age) { this.name = name; this.age = age; } @Override public boolean equals(Object obj) { if(obj.getClass() != getClass()){ return false; } Dog dog = (Dog) obj; if(dog.getAge() == age && dog.getName().equals(name)){ return true; } return false; } }
import com.xiao.Dog; public class Test { public static void main(String[] args) { Dog dog = new Dog("小旺",2); Dog dog1 = new Dog("小旺",2); System.out.println("equals结果:" + dog.equals(dog1)); System.out.println("dog 的 hashCode 值是否等于 dog1 的 hashCode 值:" +(dog.hashCode() == dog1.hashCode())); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!