Maison > Java > javaDidacticiel > le corps du texte

Introduction détaillée au rôle de hashCode en Java

黄舟
Libérer: 2017-03-29 10:38:31
original
1479 Les gens l'ont consulté

Cet article présente principalement des informations pertinentes qui expliquent en détail le rôle de hashCode en Java

ci-dessous Il s'agit de la définition officielle du document HashCode :

Nous pouvons extraire la définition du document officiel ci-dessus dans les points clés suivants :

hashcode方法返回该对象的哈希码值。支持该方法是为哈希表提供一些优点,例如,java.util.Hashtable 提供的哈希表。  
 
hashCode 的常规协定是:  
在 Java 应用程序执行期间,在同一对象上多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是对象上 equals 比较中所用的信息没有被修改。
从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。  
如果根据 equals(Object) 方法,两个对象是相等的,那么在两个对象中的每个对象上调用 hashCode 方法都必须生成相同的整数结果。  
以下情况不 是必需的:如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么在两个对象中的任一对象上调用 hashCode 方法必定会生成不同的整数结果。
但是,程序员应该知道,为不相等的对象生成不同整数结果可以提高哈希表的性能。  
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。
(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)  
 
当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
Copier après la connexion
1 .L'existence de hashCode est principalement utilisée pour accélérer la recherche, comme Hashtable, HashMap, etc. hashCode est utilisé pour déterminer l'adresse de stockage de l'objet dans la structure de stockage de hachage

2. la même méthode equals(Java.lang .Object), alors le hashCode des deux objets doit être le même
3 Si la méthode equals de l'objet est réécrite, alors le hashCode de l'objet doit également être réécrit ; autant que possible, et l'objet utilisé pour générer hashCode doit être le même que celui utilisé dans la méthode, sinon cela violera le point 2 mentionné ci-dessus

4. cela ne signifie pas nécessairement que les deux objets sont identiques, c'est-à-dire qu'ils peuvent ne pas être applicables aux méthodes égales (Java. lang.Object), mais peuvent seulement indiquer que ces deux objets se trouvent dans une structure de stockage de hachage, telle que Hashtable, et qu'ils sont "stocké dans le même panier".


Pour résumer, hashCode est utilisé pour la recherche, tandis que equals est utilisé pour comparer si deux objets sont égaux. Le passage suivant a été copié d'une réponse au message de quelqu'un d'autre :

Enfin, regardons un exemple spécifique,

1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 
例如内存中有这样的位置 
0 1 2 3 4 5 6 7  
而我有个类,这个类有个字段叫ID,我要把这个类存放在以上8个位置之一,如果不用hashcode而任意存放,那么当查找时就需要到这八个位置里挨个去找,或者用二分法一类的算法。 
但如果用hashcode那就会使效率提高很多。 
我们这个类中有个字段叫ID,那么我们就定义我们的hashcode为ID%8,然后把我们的类存放在取得得余数那个位置。
比如我们的ID为9,9除8的余数为1,那么我们就把该类存在1这个位置,如果ID是13,求得的余数是5,那么我们就把该类放在5这个位置。
这样,以后在查找该类时就可以通过ID除 8求余数直接找到存放的位置了。 
 
2.但是如果两个类有相同的hashcode怎么办那(我们假设上面的类的ID不是唯一的),例如9除以8和17除以8的余数都是1,
那么这是不是合法的,回答是:可以这样。那么如何判断呢?在这个时候就需要定义 equals了。 
也就是说,我们先通过 hashcode来判断两个类是否存放某个桶里,但这个桶里可能有很多类,那么我们就需要再通过 equals 来在这个桶里找到我们要的类。 
那么。重写了equals(),为什么还要重写hashCode()呢? 
想想,你要在一个桶里找东西,你必须先要找到这个桶啊,你不通过重写hashcode()来找到桶,光重写equals()有什么用啊
Copier après la connexion
Le résultat de sortie :

public class 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<HashTest> set = new HashSet<HashTest>(); 
    set.add(a); 
    set.add(b); 
    System.out.println(a.hashCode() == b.hashCode()); 
    System.out.println(a.equals(b)); 
    System.out.println(set); 
  } 
}
Copier après la connexion
Dans l'exemple ci-dessus, nous venons de remplacer la méthode hashCode. D'après les résultats ci-dessus, nous pouvons voir que même si les hashCode des deux objets sont égaux, les deux objets ne sont pas réellement égaux ; alors la méthode d'objet égale par défaut sera appelée, qui compare si les

références

des deux objets sont les mêmes, montrant qu'il s'agit de deux objets différents et que les références des deux objets sont définitivement incertaines. Ici, nous mettons l'objet généré dans le HashSet, et le HashSet ne peut stocker qu'un objet unique, c'est-à-dire que le même objet (applicable à la méthode equals) ne peut en stocker qu'un, mais ici il y a en fait deux objets a et b Was. placé dans HashSet, donc HashSet perd sa propre signification.
true 
false 
[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
Copier après la connexion

A ce moment nous ajoutons la méthode égale :

Le résultat obtenu à ce moment sera le suivant :

public class HashTest { 
  private int i; 
 
  public int getI() { 
    return i; 
  } 
 
  public void setI(int i) { 
    this.i = i; 
  } 
 
  <span style="color:#3366FF;"><strong>public boolean equals(Object object) { 
    if (object == null) { 
      return false; 
    } 
    if (object == this) { 
      return true; 
    } 
    if (!(object instanceof HashTest)) { 
      return false; 
    } 
    HashTest other = (HashTest) object; 
    if (other.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<HashTest> set = new HashSet<HashTest>(); 
    set.add(a); 
    set.add(b); 
    System.out.println(a.hashCode() == b.hashCode()); 
    System.out.println(a.equals(b)); 
    System.out.println(set); 
  } 
}
Copier après la connexion
Du résultat nous pouvons voir que les deux objets sont désormais complètement égaux et qu'un seul objet est stocké dans le HashSet.

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:php.cn
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