Maison > Java > javaDidacticiel > le corps du texte

Comment utiliser la méthode hashCode en Java

WBOY
Libérer: 2023-05-11 13:49:06
avant
1708 Les gens l'ont consulté

1. Présentez la méthode hashCode

  • 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),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象)。

2、为什么需要hashCode方法?

在我们编写程序的过程中,判断两个对象是否相同是十分常见且经常面对的一个问题。而 hashCode() 方法就是用来提升比较两个对象的速度的。

我们就以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:

  • 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的 hashcodeHashSet 会假设对象没有重复出现。

  • 但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同, HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。

  • 这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。

3、hashCode(),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。

4、为什么重写 equals 方法必须重写 hashcode 方法 ?

  • 我们上面讲解到 如果 两个对象 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.

Prenons comme exemple "Comment vérifier les doublons dans HashSet" pour expliquer pourquoi hashCode est nécessaire : #🎜🎜##🎜🎜##🎜🎜#Lorsque vous ajoutez des objets à HashSet, HashSet calculera d'abord la valeur 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;
    }
}
Copier après la connexion
#🎜🎜#Classe de test#🎜🎜#
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()));
    }
}
Copier après la connexion
#🎜🎜#Résultat du test # 🎜🎜##🎜🎜##🎜🎜#equals result: true#🎜🎜# Si la valeur hashCode de dog est égale à la valeur hashCode de dog1: false#🎜🎜##🎜🎜#

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!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!