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;
}
}
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
Poiché 'id' è un' int', puoi semplificare il tuo hashcode: 'return this.id;'. – assylias
@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. –