Explicación detallada de equals () y hashcode ()

es igual a ()

Se utiliza para determinar si otros objetos son iguales al objeto. El
método equals () se define de la siguiente manera en la clase de objeto:


public boolean equals(Object obj) {  
    return (this == obj);  
}

Debe prestar atención a: String, Math, Integer, Double y otras clases de encapsulación que han cubierto el método equals () de la clase de objeto cuando se usa el método equals ().
Por ejemplo, clase String


public boolean equals(Object anObject) {  
    if (this == anObject) {  
        return true;  
    }  
    if (anObject instanceof String) {  
        String anotherString = (String)anObject;  
        int n = count;  
        if (n == anotherString.count) {  
            char v1[] = value;  
            char v2[] = anotherString.value;  
            int i = offset;  
            int j = anotherString.offset;  
            while (n– != 0) {  
                if (v1[i++] != v2[j++])  
                    return false;  
            }  
            return true;  
        }  
    }  
    return false;  
} 

Inserte la descripción de la imagen aquí

código hash()

El método hashCode () devuelve un valor de código hash al objeto. Este método se utiliza para tablas hash, como HashMap.

En primer lugar, para comprender el papel de hashCode, primero debe conocer la colección en Java. En general, hay dos tipos de colecciones en Java, una es List y la otra es Set. ¿Conoces la diferencia entre ellos? Los elementos del primer conjunto están ordenados y los elementos pueden repetirse; los elementos del segundo están desordenados, pero los elementos no pueden repetirse. Luego hay un problema más serio: si desea asegurarse de que los elementos no se repitan, ¿qué se debe juzgar en función de si se repiten dos elementos? Este es el método Object.equals. Sin embargo, si la verificación se realiza cada vez que se agrega un elemento, cuando hay muchos elementos, el número de comparaciones de los elementos agregados al conjunto será muy grande. En otras palabras, si ya hay 1000 elementos en la colección, cuando el elemento número 1001 se agregue a la colección, llamará al método equals 1000 veces. Obviamente, esto reducirá en gran medida la eficiencia. Por lo tanto, Java utiliza el principio de tablas hash. El algoritmo hash también se denomina algoritmo hash, que asigna directamente datos a una dirección de acuerdo con un algoritmo específico. Si explica el algoritmo hash en detalle, necesita más espacio para artículos, no lo presentaré aquí. Los principiantes pueden entender de esta manera, el método hashCode en realidad devuelve la dirección física del almacenamiento del objeto (en realidad no es la dirección física real en la memoria, pero se puede entender de esta manera). De esta manera, cuando se agrega un nuevo elemento a la colección, primero se llama al método hashCode de este elemento, y se puede ubicar en la ubicación física donde se debe colocar. Si no hay ningún elemento en esta posición, se puede almacenar directamente en esta posición sin ninguna comparación; si ya hay un elemento en esta posición, llamará a su método equals para comparar con el nuevo elemento. Si es el mismo, no se almacenará. Si no es el mismo, hash otras direcciones. Entonces hay un problema de resolución de conflictos. De esta forma, el número de llamadas reales al método equals se reduce considerablemente, casi solo una o dos veces. Por lo tanto,
Java estipula el método eqauls y el método hashCode de la siguiente manera:

1. Si los dos objetos son iguales, sus valores hashCode deben ser los mismos;

2. Si el hashCode de dos objetos es el mismo, no necesariamente son iguales El mismo objeto mencionado anteriormente se refiere a la comparación mediante el método eqauls. Por supuesto, puede hacerlo según sea necesario, pero encontrará que el mismo objeto puede aparecer en la colección Set. Al mismo tiempo, la eficiencia de agregar nuevos elementos se reducirá en gran medida.

Si reescribe el método equal (), las dos instancias que en realidad no son un objeto son lógicamente iguales, pero el código hash no es igual.
  
  Así que recuerde reescribir el código hash.
  
  ¿Cuáles son las consecuencias de no reescribirlo? Por supuesto, por ejemplo, cuando usa hashmap, hashtable y otras clases de diseño de código hash, se mete en problemas.
  
  En cuanto a cómo reescribir un código hash, hay buenos y malos, dependiendo de las habilidades de cada persona. Todavía hay personas dedicadas que estudian excelentes algoritmos hash.

En otras palabras, List es una interfaz de contenedor de objetos ordenada y repetible, y Set es una interfaz de contenedor de objetos no ordenada y no repetible. Más adelante, hablaré sobre cómo Set logra la no repetición: para evitar la carga del sistema causada por el uso repetido del método equal, set primero llama al método hashCode para detectar si está ocupado. Si está ocupado, luego llama al Igual método para determinar si el ocupado es el mismo.

La estrecha relación entre Hashset, Hashmap, Hashtable y hashcode () y equals ()

Céntrese en
https://www.cnblogs.com/Qian123/p/5703507.html#_label2

Supongo que te gusta

Origin blog.csdn.net/weixin_43722571/article/details/99969899
Recomendado
Clasificación