2010-09-08 13 views
12

Tengo una clase que quiero configurar como teclas en HashMap. Ya he implementado el método compareTo para esa clase. Pero aún cuando lo hago:Configuración de la clase propia como clave en Java Hashmap

 
map.put(new MyKey(dummyArguements) , dummyValue); 
System.out.println(map.get(new MyKey(dummyArguements))); 

obtengo nulo. Eso significa que hashmap no puede identificar que las dos claves (para obtener & poner llamada) son las mismas.

¿Podría alguien ayudarme aquí por favor?

Respuesta

32

Debe implementar hashCode() y equals(). compareTo() se requiere adicionalmente para el mapa/conjunto ordenado.

Ver this question para más detalles.

+1

Me refiero sin falta de respeto (ni tampoco creo que esto sea cierto), pero ** ¿cómo sabes esto? He estado leyendo la documentación de ['HashMap'] (http://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html) una y otra vez; las siguientes interfaces y herencias ... y no hay nada que implique que los métodos mencionados anteriormente deban implementarse ni anularse (ya que son heredados de la clase de raíz 'Object') para que funcione correctamente con' HashMap'. –

+0

La definición de algunos métodos en la interfaz de Mapa establece algunas de las reglas. Por ejemplo containsKey() menciona específicamente equals().La documentación de hashCode() en Object especifica la relación entre it y equals(). Sin embargo, estoy de acuerdo con su punto: la documentación de HashMap debe hacer referencia al método hashCode() y documentar su uso/requisito para las claves de HashMap. –

+0

También su clase debe ser 'inmutable' – Sadegh

3

1) En general para colecciones, lo que desea sobrescribir es el método equals() (y también el método hashcode()) para su clase. compareTo()/Comparable y Comparator se usan normalmente para clasificar y solo reemplazan el uso del método equals() para la equivalencia de objetos en algunos casos; ejemplos son implementadores de SortedSet como TreeSet.

2) Cumpla con los estándares de nomenclatura de Java en su código. Sus nombres de clase deben estar en mayúscula ... por ejemplo, new MyKey(dummyArguments). Vea http://www.oracle.com/technetwork/java/codeconventions-135099.html#367 (y http://www.oracle.com/technetwork/java/codeconvtoc-136057.html) para más detalles.

+0

Clase renombrada. Gracias por señalar. :) –

0

¿Tiene la hashCode() definida? compareTo es necesario para la clasificación.

0

HashMap no marca compareTo();

HashMap verifica hashCode() y equals().

12

Debe implementar equals() y hashCode(). Tu clase también debe ser inmutable. Si es mutable, su código hash puede cambiar después de agregarlo al mapa. Entonces el mapa puede tener problemas para encontrarlo.

+3

+1 para el inmutable – helios

+0

Está haciendo algo nuevo antes de 'put' y' add'. Entonces, lo inmutable no importa. Sigue siendo un buen punto, +1. – fastcodejava

0

Al usar colecciones que dependen de hash como Map y Set, debe implementar equals() y hashCode() para garantizar la funcionalidad correcta. Si no lo hace, un nuevo myKey siempre será diferente de la clave almacenada en el mapa porque usa las implementaciones predeterminadas de equals() y hashCode().

0

Debe implementar equals() y hashCode(). Tu clase también debe ser inmutable. Si es mutable, su código hash puede cambiar después de agregarlo al mapa. Entonces el mapa puede tener problemas para encontrarlo.

0

A partir de java8 también debe implementar Comparable (agregando compareTo) porque si el número de choques hash excede 11, HashMap almacena las entradas en un árbol binario. Si no lo hace, el rendimiento sufre