2012-09-14 27 views
5

Ehi Sto usando uno HashMap per tenere traccia dei servizi e delle richieste di servizio su un Bollettino. Tuttavia, devo avere il codice hash e uguale a sbagliato perché sto ricevendo chiavi duplicate. Qualcuno può dire perché questo potrebbe essere?Perché la mia HashMap consente chiavi duplicate?

Il contenuto del keySet:

Services: [1, 1, 6, 6, 3] 
Requests: [8, 7, 6, 5, 8, 4, 5, 6, 2] 

Ecco il codice rilevante:

private static final HashMap<Advert, Integer> services = new HashMap<>(); 
... 

public class Advert { 

private int id; 
private BoardPoster poster; 

public Advert(BoardPoster poster) { 
    this.poster = poster; 
} 

public BoardPoster getPoster() { 
    return poster; 
} 

public void spawn() { 
    id = RANDOM.nextInt(ADVERT_RANGE); 
} 

public int getID() { 
    return id; 
} 

@Override 
public String toString() { 
    return Integer.toString(id); 
} 

@Override 
public boolean equals(Object o) { 
    if (o != null && o instanceof Advert) { 
     return ((Advert) o).id == id; 
    } 
    return false; 
} 

@Override 
public int hashCode() { 
    return 67 * 5 + this.id; 
} 
} 
+4

Un'osservazione: controllare 'o! = Null && o instanceof Advert' è ridondante. 'o instanceof Advert' restituisce' false' se 'o' è' null'. In Java, 'null' non è considerato un tipo di qualcosa, quindi tutti i controlli dell'istanza su di esso non riescono. – Brian

+1

Poiché 'id' è un' int', puoi semplificare il tuo hashcode: 'return this.id;'. – assylias

+0

@assylias Questo è un pessimo modo di fare un hashcode, dal momento che in realtà non è un hashing. restituire "this.id% 1000" potrebbe essere un'opzione migliore. –

risposta

18

La ragione più probabile è che gli oggetti si utilizza come chiavi sono mutabili. Quindi, se si fa qualcosa di simile:

map.put(anAdvert, 1); 
anAdvert.spawn(); //modifies id, which affects hashcode and equals 

Il comportamento della mappa sarà inaspettato.

cf Map's javadoc

Nota: grande cura deve essere esercitata se gli oggetti mutabili sono utilizzati come chiavi della mappa. Il comportamento di una mappa non viene specificato se il valore di un oggetto viene modificato in un modo che influisce su confronti uguali mentre l'oggetto è una chiave nella mappa.

+6

+1 per chiave mutabile. – kosa

+0

È buona norma usare la parola chiave 'final' per proprietà come questa. –

+1

Non utilizzare mai oggetti mutabili come tasti mappa! –

Problemi correlati