In Java, obj.hashCode()
restituisce un valore. A che serve questo codice hash nella programmazione?
In Java, obj.hashCode()
restituisce un valore. A che serve questo codice hash nella programmazione?
Risposte:
hashCode()
è utilizzato per bucket in Hash
implementazioni 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.
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?
hashCode()
metodo?
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
hashCode
metodo 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 delhashCode
metodo 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 ilhashCode
metodo 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.)
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 dihashCode()
non è più valida. Pertanto, se si sovrascrive il metodo equals (), è necessario sostituire anche ilhashCode()
metodo.
Questa risposta proviene dalla documentazione tutorial ufficiale di java SE 8
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 hashCode
modulo 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.
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.
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
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));
}
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.