hashCode()
wird verwendet, um den Hash-Code, auch Hash-Code genannt, zu erhalten, der tatsächlich eine int-Ganzzahl zurückgibt. Der Zweck dieses Hash-Codes besteht darin, die Indexposition des Objekts in der Hash-Tabelle zu bestimmen. 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()
ist in Object.java von JDK definiert, was bedeutet, dass jede Klasse in Java die Funktion hashCode()
enthält.
Die Hash-Tabelle speichert Schlüssel-Wert-Paare. Ihr Merkmal ist, dass sie den entsprechenden „Wert“ entsprechend dem „Schlüssel“ schnell abrufen kann. Dies verwendet Hash-Codes! (Sie können das benötigte Objekt schnell finden).
2. Warum wird die hashCode-Methode benötigt? 🎜🎜🎜Wenn Sie ein Objekt zuBeim Schreiben von Programmen ist die Beurteilung, ob zwei Objekte gleich sind, ein sehr häufiges und oft auftretendes Problem. Die Methode
Wir werden „So überprüfen Sie Duplikate in HashSet“ als Beispiel nehmen, um zu erklären, warum HashCode benötigt wird:hashCode()
wird verwendet, um die Geschwindigkeit des Vergleichs zweier Objekte zu verbessern.
HashSet
hinzufügen, berechnet HashSet zunächst den hashcode-Wert, um den Ort zu bestimmen, an dem das Objekt hinzugefügt wird, und wird auch mit dem <code>hashcode
-Wert anderer hinzugefügter Objekte verglichen, wenn kein passender hashcode vorhanden ist
, HashSet
geht davon aus, dass das Objekt nicht wiederholt wird. 🎜🎜🎜🎜Wenn jedoch Objekte mit demselben hashcode
-Wert gefunden werden, wird die Methode equal() aufgerufen, um zu prüfen, ob die gleichen hashcode
-Objekte wirklich gleich sind. Wenn beide identisch sind, verhindert HashSet
, dass der Join-Vorgang erfolgreich ist. Wenn es anders ist, wird es an einem anderen Ort erneut aufbereitet. 🎜🎜🎜🎜Auf diese Weise reduzieren wir die Anzahl der equals
erheblich und erhöhen dementsprechend die Ausführungsgeschwindigkeit erheblich. 🎜🎜🎜🎜3. Welche Beziehung besteht zwischen den beiden Methoden hashCode() und equal()?🎜🎜Java legt die Methode eqauls() und die Methode hashCode() wie folgt fest: 🎜🎜🎜🎜Rufen Sie hashCode( mehrmals auf same object)-Methode gibt immer den gleichen ganzzahligen Wert zurück. 🎜🎜🎜🎜Wenn a.equals(b), dann muss a.hashCode() gleich b.hashCode() sein. 🎜🎜🎜🎜Wenn !a.equals(b), dann ist a.hashCode() nicht unbedingt gleich b.hashCode(). Wenn a.hashCode () zu diesem Zeitpunkt immer nicht gleich b.hashCode () ist, wird die Leistung von Hashtabellen verbessert. 🎜🎜🎜🎜a.hashCode()==b.hashCode() dann kann a.equals(b) wahr oder falsch sein🎜🎜🎜🎜a.hashCode()! = b.hashCode(), dann ist a.equals(b) falsch. 🎜🎜🎜🎜Abkürzung der obigen Schlussfolgerung: 🎜🎜🎜🎜Wenn zwei Objekte gleich sind, geht die Java-Laufzeitumgebung davon aus, dass ihr HashCode gleich sein muss. 🎜🎜🎜🎜Wenn zwei Objekte nicht gleich sind, kann ihr HashCode gleich sein. 🎜🎜🎜🎜Wenn der HashCode zweier Objekte gleich ist, sind sie nicht unbedingt gleich. 🎜🎜🎜🎜Wenn der HashCode zweier Objekte nicht gleich ist, dürfen sie nicht gleich sein. 🎜🎜🎜🎜4. Warum muss das Überschreiben der Equals-Methode die Hashcode-Methode überschreiben? 🎜🎜🎜🎜Wir haben oben erklärt, dass, wenn zwei Objekte gleich
sind, ihre hashCode
-Werte gleich sein müssen. Wenn Sie nur die Methode equals
überschreiben, ohne die Methode hashCode
zu überschreiben, ist der Wert von hashCode
unterschiedlich und equals-Methode ist <code>true
. 🎜🎜🎜🎜In einigen Containern in Java sind zwei identische Objekte nicht zulässig. Wenn sie beim Einfügen als gleich beurteilt werden, werden sie überschrieben. Wenn Sie zu diesem Zeitpunkt nur die Methode equals
neu schreiben, ohne die Methode hashCode
neu zu schreiben, wird der hashCode
in Object basierend auf der Speicheradresse konvertiert des Objekts. Zu diesem Zeitpunkt ist es möglich, dass die Methode hashCode
nicht überschrieben wird, was dazu führt, dass dasselbe Objekt an verschiedenen Orten gehasht wird, was zu dem Problem führt, dass das Objekt nicht überschrieben werden kann. 🎜🎜🎜🎜Zum Beispiel🎜🎜Hundeklasse🎜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())); } }
Das obige ist der detaillierte Inhalt vonSo verwenden Sie die HashCode-Methode in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!