Hola estoy usando un HashMap
para realizar un seguimiento de los servicios y las solicitudes de servicio en un BulletinBoard. Sin embargo, debo tener el código hash e igual a incorrecto porque obtengo claves duplicadas. ¿Alguien puede decir por qué esto podría ser?¿Por qué mi HashMap permite duplicar claves?
El contenido del conjunto de claves:
Services: [1, 1, 6, 6, 3]
Requests: [8, 7, 6, 5, 8, 4, 5, 6, 2]
Aquí está el código correspondiente:
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;
}
}
Una observación: comprobar 'o! = Null && o instanceof Advert' es redundante. 'o instanceof Advert' devuelve' false' si 'o' es' null'. En Java, 'null' no se considera un tipo de nada, por lo que todas las verificaciones de instancia fallan. – Brian
Dado que 'id' es un' int', puede simplificar su hashcode: 'return this.id;'. – assylias
@assylias Esa es una mala forma de hacer un hashcode, ya que en realidad no es hash. devolver 'this.id% 1000' podría ser una mejor opción. –