Interviewaufzeichnung: Warum schreibt der grundlegende Datentyp von Java die hashCode-Methode neu?

Das Interview wurde gründlich befragt, also zeichnen Sie es auf, um
vorzustellen, was Hash ist, wo es existiert und warum die Methode hashCode() für Javas Basistypdaten neu geschrieben werden sollte.

1. Was ist Hash?

Der Hash-Wert (Hash-Wert) bezieht sich auf die Zuordnung von Daten beliebiger Länge in eine Datensequenz fester Länge durch einen bestimmten Algorithmus, und diese Datensequenz ist der Hash-Wert. Hash-Werte können zur Überprüfung der Dateneindeutigkeit, zur Datenverschlüsselung, zur Datenkomprimierung, zur schnellen Suche und in anderen Bereichen verwendet werden.

Wie Sie der offiziellen Java-Dokumentation entnehmen können, erben alle Klassen implizit von der Object-Klasse. Im offiziellen Dokument zu Java 8 gibt es den folgenden Absatz:
„Alle Klassen in Java werden von der Object-Klasse abgeleitet. Wenn eine Klassendeklaration keine Extens-Klausel hat, wird implizit davon ausgegangen, dass sie die Object-Klasse erweitert.“

Durch Erben der Object-Klasse 所有对象都有一个 hashCode 方法wird die Standardmethode in Object verwendet, sofern sie nicht überschrieben wird. Wird zur Berechnung des Hashwerts des Objekts verwendet. Der von hashCode() zurückgegebene Hash-Wert ist ein Wert vom Typ int. Bei Verwendung der Hash-Tabelle (HashMap, HashSet usw.) in der Java-Sammlungsklasse wird der Hash-Wert verwendet, um die Position des Objekts in der Tabelle zu bestimmen und so die Sucheffizienz zu verbessern. Daher sind die Korrektheit und Effizienz der Implementierung der hashCode-Methode entscheidend für die Leistung und Korrektheit von Java-Programmen.

2. Wo existiert der Hashwert?

Der Hash-Code-Wert ist tatsächlich unterschiedlich 由对象的内存地址转换而来. Das heißt, verschiedene Objekte haben unterschiedliche Hash-Code-Werte. Im Speicher 对象的哈希码值通常被存储在对象的对象头中befindet sich dieser Objektheader am Anfang des Objektspeichers und enthält einige Metadaten des Objekts, z. B. den Hash-Codewert, den Sperrstatus usw. Wenn wir also die hashCode()-Methode eines Objekts aufrufen, geben wir tatsächlich den im Objektheader des Objekts gespeicherten Hash-Codewert zurück.

Aber nicht alle Objekte fügen den Hash-Code in den Objektheader ein, etwa den Basistyp und die entsprechende Wrapper-Klasse

Zu den grundlegenden Datentypen (primitiven Datentypen) in Java gehören Byte, Short, Int, Long, Float, Double, Char, Boolean usw., die unveränderlich sind und keine Objekte implementieren, sodass es keinen Hash-Code für Objekte gibt.

Zu diesem Zeitpunkt werden mir definitiv Objekte wie Integer und String in den Sinn kommen. Java bietet einen automatischen Boxing- und Unboxing-Mechanismus, sodass grundlegende Datentypen automatisch in Objekte konvertiert werden können, wenn Objekte verwendet werden müssen.

Dann ist jedes Mal, wenn ein neuer String erstellt wird, sein Adresswert anders. Warum ist der endgültige Hash-Code derselbe? Nehmen Sie als Beispiel
natürlich das String-Objekt, das den Hash-Code anhand des Werts berechnet.重写了 hashCode() 方法
Strings

3. Warum sollte die Wrapper-Klasse des Basisdatentyps die hashCode-Methode überschreiben?

Es gibt hauptsächlich 2 Punkte:

1. Um die Effizienz zu verbessern

Da der grundlegende Datentyp ist 按值传递, haben Variablen mit demselben Wert auch dieselbe Adresse im Speicher und können als dasselbe Objekt betrachtet werden. Wenn Sie die Speicheradresse des Objekts als Hash-Wert verwenden, müssen Sie bei jedem Vergleich die Speicheradresse des Objekts vergleichen, wodurch sich die Suchzeit der Hash-Tabelle erhöht, da dies für die gesamte verknüpfte Liste oder Baumstruktur erforderlich ist durchlaufen werden, um das Element zu finden. Und wenn der Inhalt des Objekts als Hash-Wert verwendet wird, kann der Inhalt direkt verglichen werden, wodurch die Vergleichszeit verkürzt und das Problem der Hash-Kollision vermieden werden kann

2. Das Design ist so

Der Konstantenpool von String (String Pool) ist ein Mechanismus zur Optimierung von Strings in Java. Wenn in Java ein Zeichenfolgenobjekt erstellt wird, prüft es zunächst, ob die Zeichenfolge im Zeichenfolgenpool vorhanden ist. Wenn vorhanden, wird die Instanz im Pool zurückgegeben. Andernfalls wird eine neue Instanz erstellt und in den Pool eingefügt. Mithilfe des String-Pools können Sie die Erstellung doppelter String-Objekte vermeiden und so den Speicherverbrauch reduzieren.


String Pool verwendet auch den Inhalt der Zeichenfolge, um zu bestimmen, ob die Zeichenfolge vorhanden ist. Wenn eine neue Zeichenfolge erstellt wird, prüft es zunächst, ob bereits eine Zeichenfolge mit demselben Inhalt im Zeichenfolgenpool vorhanden ist. Wenn diese bereits vorhanden ist, wird das Zeichenfolgenobjekt im Pool zurückgegeben. Andernfalls wird ein neues Zeichenfolgenobjekt erstellt und zu in hinzugefügt der Pool. Wenn die String-Klasse die Methode hashCode() nicht überschreibt, funktioniert der String-Pool daher nicht ordnungsgemäß.

Ich denke du magst

Origin blog.csdn.net/qq_37761711/article/details/130516616
Empfohlen
Rangfolge