Was ist die Verwendung von hashCode in Java?

Antworten:

222

hashCode()verwendet wird , für bucketing in Hashwie Implementierungen HashMap, HashTable, HashSetetc.

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.

aish
quelle
27
Hallo Buddy .. Sehr nette Antwort, aber ich fand einen sehr interessanten Link für das gleiche mit leicht verständlichem praktischem Beispiel: coderanch.com/t/321515/java/java/HashCode
Logicalj
Danke Aishu. Jetzt habe ich klares Wissen über den Hashcode mit einer Erklärung zum Bucket erhalten.
Balasubramani
2
"Wenn mehr als ein Element im selben Bucket gefunden wird, wird das 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?
Saorikido
Abgesehen von Buckets ist Hashcode eine Methode, die das Objekt aufruft, um die Reihenfolge zu bestimmen, in der jedes Objekt im Speicher gespeichert wird. Wenn Objekte gleich sind, muss auch ihr Hashcode gleich sein. (Umkehrung dieser Aussage ist falsch)
NoName
1
In welchem ​​Fall würde ein Programmierer die hashCode()Methode manuell aufrufen ?
Kardinal - Setzen Sie Monica
33

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 hashCodeist:

  • Immer wenn es während einer Ausführung einer Java-Anwendung mehrmals für dasselbe Objekt aufgerufen wird, hashCodemuss 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 der hashCodeMethode 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 der hashCodeMethode 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.)

John Topley
quelle
14

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 Object hashCode()ist nicht mehr gültig. Wenn Sie die Methode equals () überschreiben, müssen Sie daher auch die hashCode()Methode überschreiben .

Diese Antwort stammt aus der offiziellen Dokumentation zum Java SE 8-Tutorial

Eli
quelle
13

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, HashSetusw. , dass Bedarf an Speicherobjekten wird eine verwenden , hashCodedie 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.

Roottraveller
quelle
6

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.

Gy 声 远 Shengyuan Lu
quelle
Nein, tut es nicht. Es setzt / bekommt den Schlüssel. Der Hashcode wird nur zum Bucketing verwendet.
Marquis of Lorne
3

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

Satyajit Das
quelle
-1

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));
}
Sudabe-Neirizi
quelle
Was bedeutet "Aufbau eines Fangmechanismus"? Und wie veranschaulicht dieser Code es?
Marquis von Lorne
-1

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.

Pritish Sahu
quelle
4
Hashcode ist nicht eindeutig. 2 ungleiche Objekte geben möglicherweise denselben Hashcode zurück.
Ranielle Canlas