2015-02-23 8 views

risposta

9

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.

+0

Non è possibile confrontare iterativamente i rispettivi 'hashCode' con il noto codice hash? Non necessariamente elegante, ma fattibile – Tgsmith61591

+4

@ Tgsmith61591 Cosa succede se più di un elemento ha lo stesso hashCode? – Eran

1

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:

  1. A che casa vado?
  2. Chi trovo?

Qui (1) verrà risposto da hashcode e (2) verrà risposto dal metodo equals.

1

A hashCode non è una proprietà di identificazione univoca, quindi no.

1

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().

3

È 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; 
    } 
}; 
+0

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. –

0

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,() 10
int myHash = 123; 
for(Object o:mySet){ 
    if(myHash == o.hashCode()){ 
    // do something.. 
    } 
}