La relación entre hashCode() y equals()

==

For 基本数据类型, == compara el valor
For 引用数据类型, == compara la dirección de memoria del objeto

equals()

Método de clase 未重写equals(): equivalente a ==comparar estos dos objetos
Método de clase 重写了equals(): la práctica habitual es 内容相等devolver verdadero si los dos objetos son verdaderos; de lo contrario, devolver fasle

==y equals()diferencia

==      的作用:主要判断两个对象是否为同一个对象
equals()的作用:主要判断两个对象内容是否相等

Requisitos de Java para equals()

1. 对称性:如果x.equals(y)返回是"true",那么y.equals(x)也应该返回是"true"2. 反射性:x.equals(x)必须返回是"true"3. 类推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也应该返回是"true"4. 一致性:如果x.equals(y)返回是"true",只要x和y内容一直不变,不管你重复x.equals(y)多少次,返回都是"true"5. 非空性:x.equals(null),永远返回是"false";x.equals(和x不同类型的对象)永远返回是"false"

hashCode () introducción

hashCode()Objectmétodos, por lo que cualquier clase en Java tiene hashCode()funciones.

hashCode()El papel de es obtener 哈希码/ 散列码.

El código hash/código hash es un entero int cuya función es determinar la posición del objeto 哈希表en索引

La tabla hash almacena pares clave-valor (clave-valor);
el principio es: se implementa la esencia de la tabla hash 数组, y el cálculo keydetermina la posición 哈希码del valueíndice en la matriz, por lo que el valor se puede recuperar después de conocer la clave ;
Entonces sus características son: puede keyrecuperar rápidamente el correspondiente según value;


La relación entre hashCode() y equals()

Cuando la tabla hash no recopile la clase , la clase
no se utilizará en las estructuras de datos que son esencialmente , y así sucesivamente. Por ejemplo, no se crea una colección de esta clase .HashSetHashtableHashMap哈希表
HashSet

¡En este caso, la clase no hashCode()tiene nada que ver ! La razón es: la posición del objeto en la tabla hash está determinada por el código hash. Si no crea una tabla hash, no necesita un hash. Naturalmente, no lo necesita.equals()
hashCode()

En este caso, se puede utilizar equals()para comparar la igualdad de dos valores de objeto. y hashCode()no tiene ningún efecto, así que ignorahashCode()

Cuando la clase sea recopilada por la tabla hash, usaremos
esta clase en HashSet, y así sucesivamente, que son esencialmente estructuras de datos. Por ejemplo, se crea una colección de esta clase .HashtableHashMap哈希表
HashSet

En este caso, el hashCode()y de la clase equals()están relacionados .

Si dos hashCode()valores de objeto son iguales, no necesariamente son iguales, puede haber una colisión hash .
Dos objetos son iguales si su hashCode()valor es el mismo y equals()la comparación devuelve verdadero


Ya hay 1000 elementos en el HashSet. ¿Qué debo hacer al insertar el elemento 1001?

(1) ¡Comparar el elemento 1001 uno por uno con los 1000 elementos anteriores es ineficiente! !
(2) Cuando se agrega un objeto a HashSet, HashSet primero calculará el valor del código hash del objeto, si no hay el mismo código hash, HashSet considerará que el objeto no aparece repetidamente. Si se encuentra un objeto con el mismo valor de código hash, se llama al método equals() para verificar si el contenido es el mismo. Si es el mismo, HashSet no permitirá que se una. Si es diferente, se repetirá en otra ubicación. De esta forma, reducimos mucho el número de iguales, lo que mejora mucho la velocidad de ejecución.


Método de cálculo hashCode() de String

"abc"
h = h * 31 + 97-- - (0 * 31 + 97)
h = h * 31 + 98-- - (0 * 31 + 97) * 31 + 98
h = h * 31 + 99-- - ((0 * 31 + 97) * 31 + 98) * 31 + 99

referencia

La diferencia entre == y equals
Respuestas a varias preguntas sobre Java hashCode() y equals()

Supongo que te gusta

Origin blog.csdn.net/weixin_37646636/article/details/132178785
Recomendado
Clasificación