Si equals()
y hashCode()
no se anulan en los objetos clave, HashMap e IdentityHashMap deben tener la misma semántica. La implementación predeterminada equals() usa semántica de referencia, y el valor predeterminado hashCode()
es el código hash de identidad del sistema del objeto.
Esto solo es perjudicial en los casos en que diferentes instancias de un objeto se pueden considerar lógicamente iguales. Por ejemplo, usted no desea utilizar IdentityHashMap si sus claves fueron:
new Integer(1)
y
new Integer(1)
ya que estos son técnicamente diferentes instancias de la clase Integer. (Usted realmente debe utilizar Integer.valueOf(1)
, pero que está poniendo fuera de tema.)
Class
como claves deben estar bien, excepto en circunstancias muy especiales (por ejemplo, la biblioteca Hibernate ORM genera subclases de las clases en tiempo de ejecución con el fin de implementar un proxy.) Como desarrollador, sería escéptico con respecto al código que almacena los objetos Connection
en un mapa como claves (¿quizás debería usar un grupo de conexiones, si está administrando conexiones de bases de datos?). Que funcionen o no depende de la implementación (ya que Connection es solo una interfaz).
Además, es importante tener en cuenta que HashMap espera que la determinación equals()
y hashCode()
permanezca constante. En particular, si implementa algún hashCode()
personalizado que utiliza campos mutables en el objeto clave, cambiar un campo clave puede hacer que la clave se 'pierda' en el cubo de hashtable incorrecto del HashMap. En estos casos, es posible que pueda usar IdentityHashMap (dependiendo del objeto y su caso de uso particular), o simplemente podría necesitar una implementación diferente de equals()/hashCode()
.
te refieres a los malos métodos hashCode ¿no es así? –