Gibt in Java obj.hashCode()
einen Wert zurück. Was ist die Verwendung dieses Hash-Codes bei der Programmierung?
Gibt in Java obj.hashCode()
einen Wert zurück. Was ist die Verwendung dieses Hash-Codes bei der Programmierung?
Antworten:
hashCode()
verwendet wird , für bucketing in Hash
wie Implementierungen HashMap
, HashTable
, HashSet
etc.
Der von empfangene Wert hashCode()
wird als Bucket-Nummer zum Speichern von Elementen der Menge / Karte verwendet. Diese Bucket-Nummer ist die Adresse des Elements innerhalb der Menge / Karte.
Wenn Sie dies tun contains()
, wird der Hash-Code des Elements verwendet. Suchen Sie dann nach dem Bucket, auf den der Hash-Code verweist. Wenn sich mehr als ein Element im selben Bucket befindet (mehrere Objekte können denselben Hashcode haben), wird mithilfe der equals()
Methode bewertet, ob die Objekte gleich sind, und dann entschieden, ob sie contains()
wahr oder falsch sind oder ob das Element sein könnte im Set hinzugefügt oder nicht.
equals()
zum Auswerten verwendet." Wenn also nur ein mit dem Hashcode übereinstimmendes Element gefunden wird, wird true direkt zurückgegeben. Da jedoch mehrere Objekte denselben Hash-Code haben können, muss er ausgeführt werden, um equals()
zu bewerten, ob das übereinstimmende Element gleich ist. Andernfalls kann es zu unerwarteten Ergebnissen kommen. Stimmt das?
hashCode()
Methode manuell aufrufen ?
Aus dem Javadoc :
Gibt einen Hashcode-Wert für das Objekt zurück. Diese Methode wird zugunsten von Hashtabellen wie den von unterstützt
java.util.Hashtable
.Der Generalvertrag von
hashCode
ist:
Immer wenn es während einer Ausführung einer Java-Anwendung mehrmals für dasselbe Objekt aufgerufen wird,
hashCode
muss die Methode konsistent dieselbe Ganzzahl zurückgeben , sofern keine Informationen geändert werden, die für gleiche Vergleiche für das Objekt verwendet werden. Diese Ganzzahl muss von einer Ausführung einer Anwendung zu einer anderen Ausführung derselben Anwendung nicht konsistent bleiben.Wenn zwei Objekte gemäß der
equals(Object)
Methode gleich sind, muss der Aufruf derhashCode
Methode für jedes der beiden Objekte das gleiche ganzzahlige Ergebnis liefern.Es ist nicht erforderlich, dass, wenn zwei Objekte gemäß der
equals(java.lang.Object)
Methode ungleich sind, der Aufruf derhashCode
Methode für jedes der beiden Objekte unterschiedliche ganzzahlige Ergebnisse liefern muss. Der Programmierer sollte sich jedoch bewusst sein, dass das Erzeugen eindeutiger ganzzahliger Ergebnisse für ungleiche Objekte die Leistung von Hashtabellen verbessern kann.Soweit dies vernünftigerweise praktikabel ist, gibt die von class Object definierte hashCode-Methode unterschiedliche Ganzzahlen für unterschiedliche Objekte zurück. (Dies wird normalerweise implementiert, indem die interne Adresse des Objekts in eine Ganzzahl konvertiert wird. Diese Implementierungstechnik wird jedoch von der Java-Programmiersprache nicht benötigt.)
Der von zurückgegebene Wert
hashCode()
ist der Hash-Code des Objekts, bei dem es sich um die hexadezimale Speicheradresse des Objekts handelt.Wenn zwei Objekte gleich sind, muss per Definition auch ihr Hash-Code gleich sein. Wenn Sie die
equals()
Methode überschreiben , ändern Sie die Art und Weise, wie zwei Objekte gleichgesetzt werden, und die Implementierung von ObjecthashCode()
ist nicht mehr gültig. Wenn Sie die Methode equals () überschreiben, müssen Sie daher auch diehashCode()
Methode überschreiben .
Diese Antwort stammt aus der offiziellen Dokumentation zum Java SE 8-Tutorial
hashCode()
ist eine Funktion, die ein Objekt nimmt und einen numerischen Wert ausgibt. Der Hashcode für ein Objekt ist immer der gleiche, wenn sich das Objekt nicht ändert.
Funktionen wie HashMap
, HashTable
, HashSet
usw. , dass Bedarf an Speicherobjekten wird eine verwenden , hashCode
die Größe ihrer internen Array Modulo in dem, was „Speicherposition“ (dh Feldposition) zu wählen , um das Objekt zu speichern.
In einigen Fällen können Kollisionen auftreten (zwei Objekte haben denselben Hashcode), und dies muss natürlich sorgfältig gelöst werden.
Obwohl Hashcode nichts mit Ihrer Geschäftslogik zu tun hat, müssen wir uns in den meisten Fällen darum kümmern. Denn wenn Ihr Objekt in einen Hash-basierten Container (HashSet, HashMap ...) gestellt wird, setzt der Container den Hashcode des Elements.
Ein Hashcode ist eine Zahl, die aus einem beliebigen Objekt generiert wird.
Auf diese Weise können Objekte schnell in einer Hashtabelle gespeichert / abgerufen werden.
Stellen Sie sich das folgende einfache Beispiel vor :
Auf dem Tisch vor dir. Sie haben neun Kisten, die jeweils mit den Nummern 1 bis 9 gekennzeichnet sind. In diesen Kisten können Sie auch einen Stapel wild unterschiedlicher Objekte aufbewahren. Sobald sie sich dort befinden, müssen Sie sie so schnell wie möglich finden können.
Was Sie brauchen, ist eine Möglichkeit, sofort zu entscheiden, in welches Feld Sie jedes Objekt eingefügt haben. Es funktioniert wie ein Index. Sie beschließen, den Kohl zu finden, und schauen nach, in welcher Kiste sich der Kohl befindet. Gehen Sie dann direkt zu dieser Kiste, um ihn zu erhalten.
Stellen Sie sich nun vor, Sie möchten sich nicht mit dem Index beschäftigen, sondern möchten sofort anhand des Objekts herausfinden, in welcher Box er sich befindet.
Im Beispiel verwenden wir eine wirklich einfache Methode: die Anzahl der Buchstaben im Namen des Objekts. Der Kohl geht also in Box 7, die Erbse in Box 3, die Rakete in Box 6, das Banjo in Box 5 und so weiter.
Was ist mit dem Nashorn? Es hat 10 Zeichen, also werden wir unseren Algorithmus ein wenig ändern und "umbrechen", so dass Objekte mit 10 Buchstaben in Feld 1, 11 Buchstaben in Feld 2 und so weiter gehen. Das sollte jedes Objekt abdecken.
Manchmal enthält eine Schachtel mehr als ein Objekt, aber wenn Sie nach einer Rakete suchen, ist es immer noch viel schneller, eine Erdnuss und eine Rakete zu vergleichen, als einen ganzen Haufen Kohl, Erbsen, Banjos und Nashörner zu überprüfen.
Das ist ein Hash-Code. Eine Möglichkeit, eine Nummer von einem Objekt abzurufen, damit es in einer Hashtabelle gespeichert werden kann. In Java kann ein Hash-Code eine beliebige Ganzzahl sein, und jeder Objekttyp ist für die Generierung seiner eigenen verantwortlich. Suchen Sie die "hashCode" -Methode von Object.
Quelle - hier
Eine der Anwendungen von hashCode () ist das Erstellen eines Catching-Mechanismus . Schauen Sie sich dieses Beispiel an:
class Point
{
public int x, y;
public Point(int x, int y)
{
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Point point = (Point) o;
if (x != point.x) return false;
return y == point.y;
}
@Override
public int hashCode()
{
int result = x;
result = 31 * result + y;
return result;
}
class Line
{
public Point start, end;
public Line(Point start, Point end)
{
this.start = start;
this.end = end;
}
@Override
public boolean equals(Object o)
{
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Line line = (Line) o;
if (!start.equals(line.start)) return false;
return end.equals(line.end);
}
@Override
public int hashCode()
{
int result = start.hashCode();
result = 31 * result + end.hashCode();
return result;
}
}
class LineToPointAdapter implements Iterable<Point>
{
private static int count = 0;
private static Map<Integer, List<Point>> cache = new HashMap<>();
private int hash;
public LineToPointAdapter(Line line)
{
hash = line.hashCode();
if (cache.get(hash) != null) return; // we already have it
System.out.println(
String.format("%d: Generating points for line [%d,%d]-[%d,%d] (no caching)",
++count, line.start.x, line.start.y, line.end.x, line.end.y));
}
hashCode()
ist ein eindeutiger Code, der von der JVM für jede Objekterstellung generiert wird.
Wir verwenden hashCode()
einige Operationen an Hashing-bezogenen Algorithmen wie Hashtable, Hashmap usw.
Die Vorteile hashCode()
vereinfachen die Suche, da es bei der Suche nach einem Objekt mit eindeutigem Code hilfreich ist, dieses Objekt herauszufinden.
Aber wir können nicht sagen, hashCode()
ist die Adresse eines Objekts. Es ist ein eindeutiger Code, der von JVM für jedes Objekt generiert wird.
Aus diesem Grund ist der Hashing-Algorithmus heutzutage der beliebteste Suchalgorithmus.