sirven respectivamente que para objetos metodo las interfaces implementar example comparar como java hash hashcode

java - respectivamente - para que es el hashcode



¿Por qué es malo el hashcode predeterminado() en java? (4)

si mal no recuerdo, la implementación predeterminada de hashCode () en java de un objeto de tipo Object () es devolver la dirección de memoria del objeto. Cuando creamos nuestras propias clases, leo que queremos sobrescribir hashCode () para que cuando las insertemos en una colección relacionada con hash como HashMap () funcione correctamente. ¿Pero por qué es mala una dirección de memoria?

Claro que definitivamente se quedará sin memoria y tendrá colisiones, pero el único caso donde veo que esto es un problema es cuando maneja TONELADAS de datos y tiene muy poca memoria, y entonces COMENZARÍA a afectar el rendimiento porque colecciones relacionadas con hachís en java resuelven colisiones por encadenamiento (un cubo se vinculará a una lista de valores que se resuelven con el mismo código de hash / índice).


Es posible que los objetos clave exactos utilizados al colocar objetos en hashmap no estén disponibles para acceder al mapa más adelante en su programa. Entonces terminarás anulando el método igual. Cuando anula el método igual, asegúrese de que sus códigos hash también sean iguales, de lo contrario no podrá recuperar los objetos del hashmap.


La implementación predeterminada funciona bien si cada objeto es único. Pero si reemplaza equals (), entonces está implícitamente diciendo que los objetos con diferentes direcciones pueden ser equivalentes entre sí. En ese caso, también debe anular hashCode ().

Piensa en la clase String.

String s1 = new String("foo"); String s2 = new String("foo");

Estas dos cadenas son iguales y, por lo tanto, sus códigos hash deben ser iguales. Pero son objetos distintos con diferentes direcciones.

s1 == s2 // false, different addresses s1.equals(s2) // true, same contents

Usar sus direcciones como códigos hash sería un error. Por lo tanto, String anula hashCode () para garantizar que las cadenas iguales tengan los mismos códigos hash. Esto ayuda a cumplir el contrato de hashCode (), que es:

Si a.equals(b) es verdadero, entonces a.hashCode() == b.hashCode() .

En pocas palabras : si anula equals (), también anula hashCode ().


Si bien no se utiliza el método equals , está bien no definir hashCode , pero después de ese contrato de hashCode es dar el mismo resultado para los objetos, que es igual. No puede estar seguro de que lo hará, por lo que debe volver a escribirlo usted mismo

código hash


Decidir qué implementación de hashCode () debe ser utilizada por la estructura de datos es implícitamente una parte de la API de hashmap.

Proporcionar cierta API con información que usted no maneja estrictamente, le quita el control de sus manos.

El uso de la implementación predeterminada de hashCode () acopla las claves que desea administrar a la dirección de la memoria , que usted no maneja y no tiene control alguno.

Supongamos que algún día querrá usar un cierto optimizador de memoria, que mueve los objetos alrededor de la memoria para obtener consistencia y un mejor rendimiento. Ya no podrá usar su estructura de datos, ya que contiene las direcciones hash originales de sus claves.

En un punto de vista más práctico,

Para recuperar valores de la estructura de datos en todo el programa, deberá mantener las referencias a todas las claves que haya insertado previamente (mediante el uso de otra estructura de datos). No podrá usar claves que sean "similares" en términos de estado del objeto.

Person steve1 = new Person("Steve","21","engineer"); Person steve2 = new Person("Steve","21","engineer"); map.put(steve1,"great worker"); map.get(steve2); // returns null because "steve2" is not considered a key like "steve1" map.get(steve1); // returns "great worker"