Qual è l'uso di hashCode in Java?


Risposte:


222

hashCode()è utilizzato per bucket in Hashimplementazioni come HashMap, HashTable, HashSet, etc.

Il valore ricevuto da hashCode()viene utilizzato come numero di bucket per la memorizzazione di elementi dell'insieme / mappa. Questo numero di bucket è l' indirizzo dell'elemento all'interno dell'insieme / mappa.

Quando lo fai contains()prenderà il codice hash dell'elemento, quindi cerca il bucket a cui punta il codice hash. Se viene trovato più di 1 elemento nello stesso bucket (più oggetti possono avere lo stesso codice hash), utilizza il equals()metodo per valutare se gli oggetti sono uguali, quindi decidere se contains()è vero o falso o decidere se l'elemento potrebbe essere aggiunto nel set o no.


28
Ciao amico .. Risposta molto bella, ma ho trovato un link molto interessante per lo stesso con un esempio pratico di facile comprensione: coderanch.com/t/321515/java/java/HashCode
Logicalj

Grazie Aishu. Ora ho una chiara conoscenza dell'hashcode con una spiegazione relativa al bucket.
Balasubramani,

2
"se si trova più di 1 elemento nello stesso bucket .. quindi usa il equals()per valutare", quindi cosa succede se viene trovato un solo elemento con codice hash trovato, restituisce vero direttamente? ma poiché più oggetti possono avere lo stesso codice hash, quindi deve essere eseguito equals()per valutare se l'elemento abbinato è uguale, altrimenti potrebbe darti il ​​risultato inaspettato, vero?
Saorikido,

Secchi a parte, l'hashcode è un metodo che l'oggetto chiama per determinare l'ordine di memorizzazione di ciascun oggetto in memoria. Se gli oggetti sono uguali, anche il loro hashcode deve essere uguale. (il contrario di questa affermazione è falso)
NoName

1
In che caso un programmatore invocherebbe manualmente il hashCode()metodo?
Cardinale - Ripristina Monica il

33

Dal Javadoc :

Restituisce un valore di codice hash per l'oggetto. Questo metodo è supportato a vantaggio di hashtabili come quelli forniti da java.util.Hashtable.

Il contratto generale di hashCodeè:

  • Ogni volta che viene invocato sullo stesso oggetto più di una volta durante un'esecuzione di un'applicazione Java, il hashCodemetodo deve restituire costantemente lo stesso numero intero , a condizione che non vengano modificate le informazioni utilizzate nei confronti uguali sull'oggetto. Questo numero intero non deve rimanere coerente da un'esecuzione di un'applicazione a un'altra esecuzione della stessa applicazione.

  • Se due oggetti sono uguali in base al equals(Object)metodo, la chiamata del hashCodemetodo su ciascuno dei due oggetti deve produrre lo stesso risultato intero.

  • È non necessario che se due oggetti sono uguali secondo il equals(java.lang.Object)metodo, quindi chiamando il hashCodemetodo su ciascuno dei due oggetti devono produrre risultati interi distinti. Tuttavia, il programmatore deve essere consapevole che la produzione di risultati interi distinti per oggetti disuguali può migliorare le prestazioni degli hashtabili.

Per quanto ragionevolmente pratico, il metodo hashCode definito dalla classe Object restituisce interi distinti per oggetti distinti. (Questo viene in genere implementato convertendo l'indirizzo interno dell'oggetto in un numero intero , ma questa tecnica di implementazione non è richiesta dal linguaggio di programmazione Java.)


14

Il valore restituito da hashCode()è il codice hash dell'oggetto, che è l'indirizzo di memoria dell'oggetto in esadecimale.

Per definizione, se due oggetti sono uguali, anche il loro codice hash deve essere uguale. Se si ignora il equals()metodo, si modifica il modo in cui due oggetti vengono equiparati e l'implementazione di Object di hashCode()non è più valida. Pertanto, se si sovrascrive il metodo equals (), è necessario sostituire anche il hashCode()metodo.

Questa risposta proviene dalla documentazione tutorial ufficiale di java SE 8


13

hashCode()è una funzione che accetta un oggetto e genera un valore numerico. L'hashcode per un oggetto è sempre lo stesso se l'oggetto non cambia.

Funzioni come HashMap, HashTable, HashSet, ecc che devono memorizzare oggetti utilizzerà un hashCodemodulo le dimensioni del loro matrice interna di scegliere in quale (cioè posizione di matrice) "posizione di memoria" per memorizzare l'oggetto.

Ci sono alcuni casi in cui possono verificarsi collisioni (due oggetti finiscono con lo stesso codice hash) e che, ovviamente, devono essere risolti con attenzione.


6

Sebbene l'hashcode non faccia nulla con la tua logica aziendale, nella maggior parte dei casi dobbiamo occuparcene. Perché quando l'oggetto viene inserito in un contenitore basato su hash (HashSet, HashMap ...), il contenitore inserisce / ottiene il codice hash dell'elemento.


No non lo fa. Mette / ottiene la chiave. L'hashCode viene utilizzato solo per il bucket,
Marchese di Lorne il

3

Un hashcode è un numero generato da qualsiasi oggetto.

Questo è ciò che consente agli oggetti di essere archiviati / recuperati rapidamente in un Hashtable.

Immagina il seguente semplice esempio :

Sul tavolo di fronte a te. hai nove scatole, ognuna contrassegnata con un numero da 1 a 9. Hai anche una pila di oggetti selvaggiamente diversi da conservare in queste scatole, ma una volta che sono lì devi essere in grado di trovarli il più rapidamente possibile.

Ciò di cui hai bisogno è un modo per decidere all'istante in quale casella hai inserito ciascun oggetto. Funziona come un indice. decidi di trovare il cavolo in modo da cercare in quale scatola si trova il cavolo, quindi vai direttamente a quella scatola per prenderlo.

Ora immagina che non vuoi preoccuparti dell'indice, ma vuoi essere in grado di scoprire immediatamente dall'oggetto in quale scatola si trova.

Nell'esempio, usiamo un modo davvero semplice per farlo: il numero di lettere nel nome dell'oggetto. Quindi il cavolo va nella casella 7, il pisello nella casella 3, il razzo nella casella 6, il banjo nella casella 5 e così via.

E il rinoceronte, però? Ha 10 caratteri, quindi cambieremo un po 'il nostro algoritmo e "avvolgeremo" in modo che gli oggetti di 10 lettere vadano nella casella 1, 11 lettere nella casella 2 e così via. Questo dovrebbe coprire qualsiasi oggetto.

A volte una scatola contiene più di un oggetto, ma se stai cercando un razzo, è ancora molto più veloce confrontare una nocciolina e un razzo, piuttosto che controllare un intero mucchio di cavoli, piselli, banjo e rinoceronti.

Questo è un codice hash. Un modo per ottenere un numero da un oggetto in modo che possa essere memorizzato in un Hashtable. In Java, un codice hash può essere qualsiasi numero intero e ogni tipo di oggetto è responsabile della generazione del proprio. Cerca il metodo "hashCode" di Object.

Fonte - qui


-1

Uno degli usi di hashCode () è la costruzione di un meccanismo di cattura . Guarda questo esempio:

        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));
}

Che cosa significa "costruire un meccanismo di cattura"? E come lo illustra questo codice?
Marchese di Lorne,

-1

hashCode()è un codice univoco che viene generato dalla JVM per ogni creazione di oggetti.

Usiamo hashCode()per eseguire alcune operazioni sugli algoritmi relativi all'hash come Hashtable, Hashmap ecc.

I vantaggi della hashCode()ricerca sono facili perché quando cerchiamo un oggetto che ha un codice univoco, aiuta a scoprire quell'oggetto.

Ma non possiamo dire che hashCode()sia l'indirizzo di un oggetto. È un codice univoco generato da JVM per ogni oggetto.

Ecco perché al giorno d'oggi l'algoritmo di hashing è l'algoritmo di ricerca più popolare.


4
Hashcode non è unico. 2 oggetti disuguali potrebbero restituire lo stesso hashcode.
Ranielle Canlas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.