Heim  >  Artikel  >  Java  >  Detaillierte Einführung in die Rolle von HashCode in Java

Detaillierte Einführung in die Rolle von HashCode in Java

黄舟
黄舟Original
2017-03-29 10:38:311425Durchsuche

Dieser Artikel stellt hauptsächlich relevante Informationen vor, die die Rolle von HashCode in Java im Detail erklären. Freunde, die sie benötigen, können sich auf

Detaillierte Erklärung der Rolle von HashCode in Java beziehen

unten Es geht um die offizielle Dokumentdefinition von HashCode:

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

Wir können die Definition des oben genannten offiziellen Dokuments in die folgenden Schlüsselpunkte extrahieren:

1 . Die Existenz von hashCode dient hauptsächlich der Schnelligkeit der Suche, z. B. Hashtable, HashMap usw. hashCode wird verwendet, um die Speicheradresse des Objekts in der Hash-Speicherstruktur zu bestimmen Wenn die Methode equal(Java.lang .Object) gleich ist, muss der HashCode der beiden Objekte gleich sein. 3. Wenn die Methode equal des Objekts neu geschrieben wird, sollte auch der HashCode des Objekts neu geschrieben werden So viel wie möglich, und das zum Generieren verwendete Objekt hashCode muss mit gleich sein Die in der Methode verwendeten müssen konsistent sein, sonst verstößt es gegen den oben genannten Punkt 2
Derselbe HashCode von zwei Objekten ist nicht vorhanden Dies bedeutet zwangsläufig, dass die beiden Objekte gleich sind, d. im selben Korb aufbewahrt werden“.

Zusammenfassend lässt sich sagen, dass HashCode zum Suchen verwendet wird, während Equals zum Vergleichen verwendet wird, ob zwei Objekte gleich sind. Die folgende Passage wurde aus einer Antwort auf den Beitrag einer anderen Person kopiert:

Schauen wir uns zum Schluss ein konkretes Beispiel an,
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()有什么用啊

Das Ausgabeergebnis:
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); 
  } 
}

Im obigen Beispiel haben wir nur die Methode hashCode überschrieben. Aus den obigen Ergebnissen können wir ersehen, dass die beiden Objekte nicht gleich sind. Dann wird die Standardmethode „equals“ des Objekts aufgerufen, die vergleicht, ob die
true 
false 
[com.ubs.sae.test.HashTest@1, com.ubs.sae.test.HashTest@1]
-Referenzen

der beiden Objekte gleich sind. Dies zeigt, dass es sich um zwei verschiedene Objekte handelt und die Referenzen der beiden Objekte definitiv unsicher sind. Hier legen wir das generierte Objekt in HashSet ab, und HashSet kann nur ein eindeutiges Objekt speichern, das heißt, dasselbe Objekt (anwendbar auf die Methode „equals“) kann nur eines speichern, aber hier gibt es tatsächlich zwei Objekte a und b in HashSet platziert, sodass HashSet seine eigene Bedeutung verliert.
Zu diesem Zeitpunkt fügen wir die Gleichheitsmethode hinzu:

Das zu diesem Zeitpunkt erhaltene Ergebnis sieht wie folgt aus:
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); 
  } 
}

Aus dem Ergebnis Wir können sehen, dass die beiden Objekte jetzt völlig gleich sind und nur ein Objekt im HashSet gespeichert ist.
true 
true 
[com.ubs.sae.test.HashTest@1]

Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in die Rolle von HashCode in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn