2012-09-14 19 views
5

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; 
} 
} 
+4

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

+1

Dado que 'id' es un' int', puede simplificar su hashcode: 'return this.id;'. – assylias

+0

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

Respuesta

18

La razón más probable es que los objetos que utiliza como teclas son mutables. Por lo tanto, si hace algo como:

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

El comportamiento del mapa será inesperado.

cf Map's javadoc

Nota: el gran cuidado debe tener cuidado si se utilizan los objetos mutables como teclas de mapas. El comportamiento de un mapa no se especifica si el valor de un objeto se cambia de una manera que afecta a las comparaciones iguales mientras el objeto es una clave en el mapa.

+6

+1 para clave mutable. – kosa

+0

Es una buena práctica usar la palabra clave 'final' para propiedades como esta. –

+1

¡Nunca use objetos mutables como claves de mapa! –

Cuestiones relacionadas