Posso verificare se un oggetto è in un HashSet
se ho solo il codice hash dell'oggetto, ma non l'oggetto stesso?Verificare se l'elemento esiste in HashSet tramite il suo hash
risposta
Non è possibile, dal momento che la hashCode
viene utilizzato solo per individuare il contenitore in cui l'oggetto è memorizzato all'interno del HashSet
. Potrebbero esserci più elementi nello stesso raccoglitore e HashSet
utilizza equals
per determinare se l'elemento cercato esiste nel contenitore a cui è stato eseguito il mapping dello hashCode
.
Il contenitore può contenere più elementi con lo stesso hashCode
, quindi conoscere solo lo hashCode
non è sufficiente.
No non puoi. Sono necessari sia equals sia hashcode per trovare un oggetto in una raccolta hash. Il metodo hashcode indica a quale bucket trovare l'oggetto e il metodo equals trova l'oggetto nel bucket.
Un esempio del mondo reale sarebbe una casa con molte persone. Se mi dici di andare a cercare qualcuno in una casa, ti farò due domande:
- A che casa vado?
- Chi trovo?
Qui (1) verrà risposto da hashcode e (2) verrà risposto dal metodo equals.
A hashCode
non è una proprietà di identificazione univoca, quindi no.
No, perché 2 oggetti possono avere lo stesso codice hash. L'unicità degli oggetti in un Set
(o chiavi in un Map
) viene controllata rispetto a hashCode()
eequals()
.
È possibile effettuare un oggetto speciale, qualcosa di simile
int hashCode = 1; // your
new Object() {
@Override
public boolean equals(Object obj) {
return true;
}
@Override
public int hashCode() {
return hashCode;
}
};
Questo è intelligente, ma dipende dal set che chiama 'cleverObject.equals (objectInSet)'. Se ci sono delle implementazioni là fuori che testano 'objectInSet.equals (cleverObject)', o se l'implementazione in java.util cambia, questo si interromperà. In altre parole, stai violando il contratto 'equals', e potresti farla franca per un po ', ma potrebbe tornare a morderti. –
Tutti gli oggetti hanno il metodo hashCode(), chiamato da HashSet, HashMap, ecc ..
È possibile ignorare questo metodo per definire la propria logica
@Override
public int hashCode() {
return <<MY CODE HERE>>;
}
o iterare il vostro HashSet e verificare hashCode valore
, più semplice,() 10int myHash = 123;
for(Object o:mySet){
if(myHash == o.hashCode()){
// do something..
}
}
Non è possibile confrontare iterativamente i rispettivi 'hashCode' con il noto codice hash? Non necessariamente elegante, ma fattibile – Tgsmith61591
@ Tgsmith61591 Cosa succede se più di un elemento ha lo stesso hashCode? – Eran