Recientemente leí este documento de Developer Works .
El documento se trata de definir hashCode()
y de manera equals()
efectiva y correcta, sin embargo, no puedo entender por qué necesitamos anular estos dos métodos.
¿Cómo puedo tomar la decisión de implementar estos métodos de manera eficiente?
Respuestas:
Joshua Bloch dice sobre Java efectivo
Tratemos de entenderlo con un ejemplo de lo que sucedería si anulamos
equals()
sin anularhashCode()
e intentamos usar aMap
.Digamos que tenemos una clase como esta y que dos objetos de
MyClass
son iguales si suimportantField
es igual (conhashCode()
yequals()
generado por eclipse)Anular solo
equals
Si solo
equals
se anula, entonces cuando llamemyMap.put(first,someValue)
primero se convertirá en hash a algún segmento y cuando lo llamemyMap.put(second,someOtherValue)
se dividirá en hash a otro segmento (ya que tienen un valor diferentehashCode
). Entonces, aunque son iguales, ya que no se dividen en el mismo cubo, el mapa no puede darse cuenta y ambos permanecen en el mapa.Aunque no es necesario anular
equals()
si anulamoshashCode()
, veamos qué sucedería en este caso particular donde sabemos que dos objetos deMyClass
son iguales siimportantField
son iguales pero no anulamosequals()
.Anular solo
hashCode
Imagina que tienes esto
Si solo anula
hashCode
, cuando llamemyMap.put(first,someValue)
primero toma, calcula suhashCode
y lo almacena en un cubo determinado. Luego, cuando lo llamemyMap.put(second,someOtherValue)
, debe reemplazar primero con el segundo según la Documentación del mapa porque son iguales (de acuerdo con los requisitos comerciales).Pero el problema es que igual no se redefinió, por lo que cuando el mapa se desplaza
second
e itera a través del cubo buscando si hay un objetok
tal quesecond.equals(k)
sea cierto, no encontrará ninguno comosecond.equals(first)
lo seráfalse
.Espero que sea claro
fuente
if you think you need to override one, then you need to override both of them
Está Mal. Debe anularhashCode
si su clase anulaequals
pero revertir no es cierto.equals
violaría el contrato enunciado en el javadoc deObject
: "Si dos objetos son iguales de acuerdo con elequals(Object)
método, entonces llamar alhashCode
método en cada uno de los dos objetos debe producir el mismo resultado entero". Claro, no todas las partes de todos los contratos se ejercen en todos los códigos, pero aún así, formalmente hablando, es una violación y consideraría que es un error a la espera de suceder.Colecciones como
HashMap
yHashSet
usan un valor de código hash de un objeto para determinar cómo debe almacenarse dentro de una colección, y el código hash se usa nuevamente para ubicar el objeto en su colección.La recuperación de hash es un proceso de dos pasos:
hashCode()
)equals()
)Aquí hay un pequeño ejemplo de por qué deberíamos anular
equals()
yhashcode()
.Considere una
Employee
clase que tiene dos campos: edad y nombre.Ahora cree una clase, inserte un
Employee
objeto en ayHashSet
pruebe si ese objeto está presente o no.Imprimirá lo siguiente:
Ahora descomente el
hashcode()
método, ejecute lo mismo y la salida sería:Ahora, ¿puede ver por qué si dos objetos se consideran iguales, sus códigos hash también deben ser iguales? De lo contrario, nunca podrá encontrar el objeto, ya que el método de código hash predeterminado en la clase Objeto prácticamente siempre presenta un número único para cada objeto, incluso si el
equals()
método se anula de tal manera que dos o más objetos se consideran iguales . No importa cuán iguales sean los objetos si sus hashcode s no reflejan eso. Entonces, una vez más: si dos objetos son iguales, su códigos hash también deben ser iguales.fuente
Al definir
equals()
y de formahashCode()
coherente, puede mejorar la usabilidad de sus clases como claves en colecciones basadas en hash. Como explica el documento de API para hashCode: "Este método es compatible en beneficio de tablas hash como las proporcionadas porjava.util.Hashtable
".La mejor respuesta a su pregunta sobre cómo implementar estos métodos de manera eficiente es sugerirle que lea el Capítulo 3 de Effective Java .
fuente
hashCode()
.En pocas palabras, el método igual en la comprobación de objetos para la igualdad de referencia, donde dos instancias de su clase aún podrían ser semánticamente iguales cuando las propiedades son iguales. Esto es importante, por ejemplo, cuando coloca sus objetos en un contenedor que utiliza igual y hashcode, como HashMap y Set . Digamos que tenemos una clase como:
Creamos dos instancias con la misma identificación :
Sin anular iguales, estamos obteniendo:
¿Correcto? Bueno, tal vez, si esto es lo que quieres. Pero supongamos que queremos que los objetos con la misma identificación sean el mismo objeto, independientemente de si se trata de dos instancias diferentes. Anulamos los iguales (y el código hash):
En cuanto a la implementación de equals y hashcode, puedo recomendar el uso de los métodos de ayuda de Guava
fuente
La identidad no es igualdad.
==
identidad de prueba del .equals(Object obj)
El método compara la prueba de igualdad (es decir, necesitamos distinguir la igualdad anulando el método)Primero tenemos que entender el uso del método igual.
Para identificar diferencias entre dos objetos, necesitamos anular el método igual.
Por ejemplo:
Ahora el método hashCode puede entender fácilmente.
hashCode produce un número entero para almacenar objetos en estructuras de datos como HashMap , HashSet .
Supongamos que tenemos el método de anulación igual
Customer
que el anterior,Mientras trabajamos con la estructura de datos cuando almacenamos objetos en cubos (el cubo es un nombre elegante para la carpeta). Si utilizamos la técnica hash incorporada, para los dos clientes anteriores genera dos códigos hash diferentes. Así que estamos almacenando el mismo objeto idéntico en dos lugares diferentes. Para evitar este tipo de problemas, debemos anular el método hashCode también basado en los siguientes principios.
fuente
Ok, déjenme explicar el concepto en palabras muy simples.
En primer lugar, desde una perspectiva más amplia, tenemos colecciones, y el hashmap es una de las estructuras de datos en las colecciones.
Para entender por qué tenemos que anular los métodos de igual y hashcode, si es necesario primero entender qué es hashmap y qué hace.
Un hashmap es una estructura de datos que almacena pares de datos de valores clave en forma de matriz. Digamos a [], donde cada elemento en 'a' es un par de valores clave.
Además, cada índice de la matriz anterior puede vincularse con una lista que tenga más de un valor en un índice.
Ahora, ¿por qué se usa un hashmap? Si tenemos que buscar entre una gran matriz, buscar en cada una de ellas si no será eficiente, entonces, ¿qué técnica de hash nos dice que preprocesemos la matriz con cierta lógica y agrupemos los elementos basados en esa lógica, es decir, Hashing?
por ejemplo: tenemos una matriz 1,2,3,4,5,6,7,8,9,10,11 y aplicamos una función hash mod 10, de modo que 1,11 se agruparán. Entonces, si tuviéramos que buscar 11 en la matriz anterior, tendríamos que iterar la matriz completa, pero cuando la agrupamos, limitamos nuestro alcance de iteración, mejorando así la velocidad. Esa estructura de datos utilizada para almacenar toda la información anterior se puede considerar como una matriz 2D para simplificar
Ahora, aparte del hashmap anterior, también indica que no agregará ningún duplicado en él. Y esta es la razón principal por la que tenemos que anular los iguales y el código hash
Entonces, cuando se dice que explica el funcionamiento interno de hashmap, necesitamos encontrar qué métodos tiene el hashmap y cómo sigue las reglas anteriores que expliqué anteriormente
entonces el hashmap tiene un método llamado put (K, V), y de acuerdo con el hashmap, debe seguir las reglas anteriores de distribuir eficientemente la matriz y no agregar duplicados
así que lo que pone es que primero generará el código hash para la clave dada para decidir en qué índice debe ingresar el valor. Si no hay nada presente en ese índice, entonces el nuevo valor se agregará allí, si ya hay algo presente allí entonces el nuevo valor debe agregarse después del final de la lista vinculada en ese índice. pero recuerde que no se deben agregar duplicados según el comportamiento deseado del hashmap. digamos que tienes dos objetos enteros aa = 11, bb = 11. Como cada objeto derivado de la clase de objeto, la implementación predeterminada para comparar dos objetos es que compara la referencia y no los valores dentro del objeto. Entonces, en el caso anterior, aunque sean semánticamente iguales, no pasarán la prueba de igualdad, y existe la posibilidad de que existan dos objetos que tengan el mismo código hash y los mismos valores creando así duplicados. Si anulamos, podríamos evitar agregar duplicados. También puedes referirte aDetalle de trabajo
fuente
hashCode()
:Si solo anula el método de código hash, no sucederá nada. Porque siempre devuelve nuevo
hashCode
para cada objeto como una clase de objeto.equals()
:Si solo anula el método de igualdad,
a.equals(b)
es cierto que significa quehashCode
a y b deben ser iguales pero no suceder. Porque no anulaste elhashCode
método.Nota: el
hashCode()
método de la clase Object siempre devuelve nuevohashCode
para cada objeto.Entonces, cuando necesite usar su objeto en la colección basada en hashing, debe anular ambos
equals()
yhashCode()
.fuente
Java pone una regla que
Entonces, si en nuestra clase anulamos
equals()
, deberíamos anular elhashcode()
método también para seguir esta regla. Ambos métodos,equals()
yhashcode()
, se utilizanHashtable
, por ejemplo, para almacenar valores como pares clave-valor. Si anulamos uno y no el otro, existe la posibilidad de queHashtable
no funcione como deseamos, si usamos dicho objeto como clave.fuente
Porque si no los anula, usará la implementación predeterminada en Object.
Teniendo en cuenta que la igualdad y los valores de hascode generalmente requieren conocimiento de lo que constituye un objeto, generalmente deberán redefinirse en su clase para tener un significado tangible.
fuente
Para usar nuestros propios objetos de clase como claves en colecciones como HashMap, Hashtable, etc., debemos anular ambos métodos (hashCode () y equals ()) teniendo en cuenta el funcionamiento interno de la colección. De lo contrario, conduce a resultados incorrectos que no se esperan.
fuente
Agregando a la respuesta de @Lombo
¿Cuándo necesitarás anular equals ()?
La implementación predeterminada de Object's equals () es
lo que significa que dos objetos se considerarán iguales solo si tienen la misma dirección de memoria, lo que será cierto solo si está comparando un objeto consigo mismo.
Pero es posible que desee considerar dos objetos iguales si tienen el mismo valor para una o más de sus propiedades (Consulte el ejemplo dado en la respuesta de @Lombo).
Entonces anularás
equals()
en estas situaciones y darías tus propias condiciones para la igualdad.He implementado con éxito equals () y está funcionando muy bien. Entonces, ¿por qué piden anular también hashCode ()?
Bueno, siempre y cuando no uses Colecciones basadas en "Hash" en tu clase definida por el usuario, está bien. Pero en el futuro es posible que desee usar
HashMap
oHashSet
si no lo haceoverride
y "implementa correctamente" hashCode () , esta colección basada en Hash no funcionará según lo previsto.Reemplazar solo es igual (adición a la respuesta de @Lombo)
En primer lugar, HashMap comprueba si el hashCode de
second
es el mismo quefirst
. Solo si los valores son los mismos, se procederá a verificar la igualdad en el mismo depósito.Pero aquí el hashCode es diferente para estos 2 objetos (porque tienen una dirección de memoria diferente de la implementación predeterminada). Por lo tanto, ni siquiera le importará verificar la igualdad.
Si tiene un punto de interrupción dentro de su método equals () anulado, no intervendría si tienen diferentes códigos hash.
contains()
compruebahashCode()
y solo si son iguales llamaría a suequals()
método.¿Por qué no podemos hacer que HashMap verifique la igualdad en todos los cubos? ¡¡Entonces no hay necesidad de anular hashCode () !!
Entonces te estás perdiendo el punto de las colecciones basadas en hash. Considera lo siguiente :
Las siguientes son las claves almacenadas en forma de cubos.
Digamos que quieres saber si el mapa contiene la clave 10. ¿Quieres buscar en todos los cubos? o ¿Desea buscar solo un cubo?
Basado en el hashCode, usted identificaría que si 10 está presente, debe estar presente en el Bucket 1. ¡Entonces solo se buscará el Bucket 1!
fuente
hashCode()
para determinar el depósito y usa elequals()
método para encontrar si el valor ya está presente en el depósito. Si no se agregará más, se reemplazará con el valor actualhashCode()
para buscar primero la entrada (bucket) yequals()
para encontrar el valor en Entrysi ambos se anulan,
Mapa < A >
si igual no se anula
Mapa < A >
Si hashCode no se anula
Mapa < A >
HashCode Equal Contract
fuente
Considere la recolección de bolas en un cubo todo en color negro. Su trabajo es colorear esas bolas de la siguiente manera y usarlas para el juego apropiado,
Para tenis: amarillo, rojo. Para Cricket - Blanco
Ahora el cubo tiene bolas en tres colores amarillo, rojo y blanco. Y eso ahora hiciste el color Solo tú sabes qué color es para qué juego.
Colorear las bolas - Hashing. Elegir la pelota para el juego - Igual.
Si hiciste el color y alguien elige la pelota para el cricket o el tenis, ¡no les importará el color!
fuente
Estaba buscando la explicación "Si solo anula el código hash, entonces cuando lo llama
myMap.put(first,someValue)
toma primero, calcula su código hash y lo almacena en un cubo determinado. Luego, cuando llamamyMap.put(first,someOtherValue)
, debe reemplazar primero por segundo según la Documentación del mapa porque son iguales (según nuestra definición) ". :Creo que la segunda vez que estamos agregando
myMap
, debería ser el 'segundo' objeto comomyMap.put(second,someOtherValue)
fuente
1) El error común se muestra en el siguiente ejemplo.
el coche verde no se encuentra
2. Problema causado por hashCode ()
El problema es causado por el método no reemplazado
hashCode()
. El contrato entreequals()
yhashCode()
es:Si dos objetos tienen el mismo código hash, pueden o no ser iguales.
fuente
Es útil cuando se utilizan objetos de valor . Lo siguiente es un extracto del repositorio de patrones de Portland :
fuente
Suponga que tiene la clase (A) que agrega otros dos (B) (C), y necesita almacenar instancias de (A) dentro de la tabla hash. La implementación predeterminada solo permite distinguir instancias, pero no por (B) y (C). Entonces, dos instancias de A podrían ser iguales, pero el valor predeterminado no le permitiría compararlas de la manera correcta.
fuente
Los métodos equals y hashcode se definen en la clase de objeto. Por defecto, si el método igual devuelve verdadero, el sistema irá más allá y verificará el valor del código hash. Si el código hash de los 2 objetos también es el mismo, los objetos se considerarán iguales. Entonces, si anula solo el método igual, entonces, aunque el método igual anulado indica que 2 objetos son iguales, el código hash definido por el sistema puede no indicar que los 2 objetos son iguales. Por lo tanto, también debemos anular el código hash.
fuente
true
paraequals
no serán considerados como juego. Por otro lado, si las colecciones se dan cuenta de que las cosas no pueden tener el mismo código hash, es probable que no se den cuenta de que son iguales.Métodos de igualdad y hashcode en Java
Son métodos de la clase java.lang.Object, que es la superclase de todas las clases (clases personalizadas y otras definidas en la API de Java).
Implementación:
public boolean equals (Objeto obj)
Este método simplemente verifica si dos referencias de objeto x e y se refieren al mismo objeto. es decir, comprueba si x == y.
Es reflexivo: para cualquier valor de referencia x, x.equals (x) debería devolver verdadero.
Es simétrico: para cualquier valor de referencia x e y, x.equals (y) debería devolver verdadero si y solo si y.equals (x) devuelve verdadero.
Es transitivo: para cualquier valor de referencia x, y y z, si x.equals (y) devuelve verdadero e y.equals (z) devuelve verdadero, entonces x.equals (z) debería devolver verdadero.
Es coherente: para cualquier valor de referencia x e y, las invocaciones múltiples de x.equals (y) devuelven constantemente verdadero o constantemente devuelven falso, siempre que no se modifique la información utilizada en comparaciones iguales en el objeto.
public int hashCode ()
Este método devuelve el valor del código hash para el objeto en el que se invoca este método. Este método devuelve el valor del código hash como un entero y es compatible con el beneficio de clases de colección basadas en hash como Hashtable, HashMap, HashSet, etc. Este método debe ser anulado en cada clase que anula el método de igual.
El contrato general de hashCode es:
Cada vez que se invoca en el mismo objeto más de una vez durante la ejecución de una aplicación Java, el método hashCode debe devolver constantemente el mismo entero, siempre que no se modifique la información utilizada en comparaciones iguales sobre el objeto.
Este número entero no necesita permanecer consistente de una ejecución de una aplicación a otra ejecución de la misma aplicación.
Si dos objetos son iguales de acuerdo con el método igual (Objeto), entonces llamar al método hashCode en cada uno de los dos objetos debe producir el mismo resultado entero.
No se requiere que si dos objetos son desiguales de acuerdo con el método igual (java.lang.Object), llamar al método hashCode en cada uno de los dos objetos debe producir resultados enteros distintos. Sin embargo, el programador debe ser consciente de que producir resultados enteros distintos para objetos desiguales puede mejorar el rendimiento de las tablas hash.
Recursos:
JavaRanch
Imagen
fuente
En el siguiente ejemplo, si comenta la anulación para equals o hashcode en la clase Person, este código no podrá buscar el orden de Tom. El uso de la implementación predeterminada de hashcode puede causar fallas en las búsquedas de tablas hash.
Lo que tengo a continuación es un código simplificado que extrae el orden de las personas por persona. La persona se está utilizando como clave en la tabla hash.
fuente
La clase de cadena y las clases de contenedor tienen una implementación diferente de
equals()
yhashCode()
métodos que la clase de objeto. El método equals () de la clase Object compara las referencias de los objetos, no los contenidos. El método hashCode () de la clase Object devuelve un código hash distinto para cada objeto, independientemente de si el contenido es el mismo.Conduce un problema cuando usa la colección de mapas y la clave es de tipo Persistente, tipo StringBuffer / builder. Como no anulan equals () y hashCode () a diferencia de la clase String, equals () devolverá falso cuando compare dos objetos diferentes, aunque ambos tengan el mismo contenido. Hará que el hashMap almacene las mismas claves de contenido. Almacenar las mismas claves de contenido significa que está violando la regla de Map porque Map no permite duplicar claves en absoluto. Por lo tanto, anula los métodos equals () y hashCode () en su clase y proporciona la implementación (IDE puede generar estos métodos) para que funcionen igual que los equals () y hashCode () de String y eviten las mismas claves de contenido.
Debe anular el método hashCode () junto con equals () porque equals () funciona según el código hash.
Además, anular el método hashCode () junto con equals () ayuda a mantener intacto el contrato equals () - hashCode (): "Si dos objetos son iguales, entonces deben tener el mismo código hash".
¿Cuándo necesita escribir una implementación personalizada para hashCode ()?
Como sabemos, el funcionamiento interno de HashMap se basa en el principio de Hashing. Hay ciertos cubos donde se almacenan los conjuntos de entradas. Puede personalizar la implementación de hashCode () según sus requisitos para que los mismos objetos de categoría se puedan almacenar en el mismo índice. Cuando almacena los valores en la colección de mapas utilizando el
put(k,v)
método, la implementación interna de put () es:Significa, genera índice y el índice se genera en base al código hash de un objeto clave particular. Por lo tanto, haga que este método genere código hash de acuerdo con sus requisitos porque los mismos conjuntos de entradas de código hash se almacenarán en el mismo depósito o índice.
¡Eso es!
fuente
hashCode()
El método se utiliza para obtener un número entero único para un objeto dado. Este entero se usa para determinar la ubicación del depósito, cuando este objeto necesita ser almacenado en algunosHashTable
,HashMap
como la estructura de datos. Por defecto, elhashCode()
método Object devuelve una representación entera de la dirección de memoria donde se almacena el objeto.El
hashCode()
método de los objetos se usa cuando los insertamos en aHashTable
,HashMap
oHashSet
. Más informaciónHashTables
en Wikipedia.org para referencia.Para insertar cualquier entrada en la estructura de datos del mapa, necesitamos clave y valor. Si tanto la clave como los valores son tipos de datos definidos por el usuario,
hashCode()
la clave determinará dónde almacenar el objeto internamente. Cuando sea necesario buscar el objeto del mapa también, el código hash de la clave determinará dónde buscar el objeto.El código hash solo apunta internamente a una determinada "área" (o lista, depósito, etc.). Dado que diferentes objetos clave podrían tener el mismo código hash, el código hash en sí mismo no garantiza que se encuentre la clave correcta. La
HashTable
continuación itera esta área (todas las claves con el mismo código hash) y utiliza la clave delequals()
método para encontrar la clave correcta. Una vez que se encuentra la clave correcta, se devuelve el objeto almacenado para esa clave.Entonces, como podemos ver, se utiliza una combinación de los métodos
hashCode()
yequals()
al almacenar y al buscar objetos en aHashTable
.NOTAS
Utilice siempre los mismos atributos de un objeto para generar
hashCode()
yequals()
ambos. Como en nuestro caso, hemos utilizado la identificación del empleado.equals()
debe ser coherente (si los objetos no se modifican, debe seguir devolviendo el mismo valor).Cada vez
a.equals(b)
, entoncesa.hashCode()
debe ser igual queb.hashCode()
.Si anula uno, entonces debe anular el otro.
http://parameshk.blogspot.in/2014/10/examples-of-comparable-comporator.html
fuente
hashCode()
no se utiliza para devolver un número entero único para cada objeto. Eso es imposible. Usted mismo ha contradicho esto en la segunda oración del cuarto párrafo.En mi humilde opinión, es según la regla dice: si dos objetos son iguales, entonces deberían tener el mismo hash, es decir, los objetos iguales deberían producir valores de hash iguales.
Dado anteriormente, el valor predeterminado equals () en Object es == que hace una comparación en la dirección, hashCode () devuelve la dirección en entero (hash en la dirección real) que nuevamente es distinta para Object distinto.
Si necesita usar los Objetos personalizados en las colecciones basadas en Hash, debe anular tanto equals () como hashCode (), por ejemplo, si deseo mantener el HashSet de los Objetos de empleado, si no utilizo hashCode y equals más fuertes Puedo terminar anulando los dos Objetos de empleado diferentes, esto sucede cuando uso la edad como hashCode (), sin embargo, debería estar usando el valor único que puede ser la ID de empleado.
fuente
Para ayudarlo a verificar si hay objetos duplicados, necesitamos un igual y un código hash personalizado.
Dado que el código hash siempre devuelve un número, siempre es rápido recuperar un objeto utilizando un número en lugar de una clave alfabética. ¿Cómo va a hacer? Supongamos que creamos un nuevo objeto al pasar algún valor que ya está disponible en algún otro objeto. Ahora el nuevo objeto devolverá el mismo valor hash que otro objeto porque el valor pasado es el mismo. Una vez que se devuelve el mismo valor hash, JVM irá a la misma dirección de memoria cada vez y, en caso de que haya más de un objeto presente para el mismo valor hash, utilizará el método equals () para identificar el objeto correcto.
fuente
Cuando desee almacenar y recuperar su objeto personalizado como clave en Map, siempre debe anular equals y hashCode en su objeto personalizado. P.ej:
Aquí p1 y p2 se considerarán como un solo objeto y el
map
tamaño será solo 1 porque son iguales.fuente
Clase de prueba
En Object Class equals (Object obj) se usa para comparar la comparación de direcciones, por eso cuando en Test class si compara dos objetos, entonces es igual al método que da falso pero cuando anulamos hashcode () puede comparar el contenido y dar el resultado adecuado.
fuente
Si anula
equals()
y nohashcode()
, no encontrará ningún problema a menos que usted u otra persona use ese tipo de clase en una colección hash comoHashSet
. La gente antes que yo ha explicado claramente la teoría documentada varias veces, solo estoy aquí para proporcionar un ejemplo muy simple.Considere una clase cuya
equals()
necesidad de significar algo personalizado:Ahora considere esta clase principal: -
Esto producirá el siguiente resultado: -
Estoy contento con los resultados. Pero si no lo he anulado
hashCode()
, causará pesadilla ya que los objetosRishav
con el mismo contenido de miembro ya no serán tratados como únicos, yahashCode
que serán diferentes, como se genera por el comportamiento predeterminado, aquí está el resultado:fuente
Ambos métodos están definidos en la clase Object. Y ambos están en su implementación más simple. Entonces, cuando lo necesite, desea agregar más implementación a estos métodos, entonces tiene una anulación en su clase.
Por ejemplo: el método equals () en el objeto solo verifica su igualdad en la referencia. Entonces, si necesita comparar su estado también, puede anularlo como se hace en la clase String.
fuente
Bah: "Debe anular hashCode () en cada clase que anule equals ()".
[de Java efectivo, por Joshua Bloch?]
¿No es este el camino equivocado? Anular hashCode probablemente implica que está escribiendo una clase de clave hash, pero anular igual ciertamente no lo hace. Hay muchas clases que no se usan como claves hash, pero quieren un método de prueba de igualdad lógica por alguna otra razón. Si elige "igual" para él, entonces se le puede ordenar que escriba una implementación de hashCode mediante la aplicación excesiva de esta regla. Todo lo que logra es agregar código no probado en la base de código, un mal que espera hacer tropezar a alguien en el futuro. También escribir código que no necesita es anti-ágil. Simplemente está mal (y una idea generada probablemente sea incompatible con tus iguales hechos a mano).
¿Seguramente deberían haber ordenado una interfaz en los objetos escritos para ser utilizados como claves? En cualquier caso, Object nunca debería haber proporcionado hashCode () y equals () imho por defecto. Probablemente se alienta a muchas colecciones hash rotas.
Pero de todos modos, creo que la "regla" está escrita al frente. Mientras tanto, seguiré evitando el uso de "iguales" para los métodos de prueba de igualdad :-(
fuente