En primer lugar, para comprender la función de hashCode, primero debe conocer la colección en Java.
En términos generales, hay dos tipos de colecciones en Java, una es Lista y la otra es Conjunto.
¿Conoces su diferencia? Los elementos del primer conjunto están ordenados y los elementos del segundo conjunto están desordenados, pero no se pueden repetir.
Así que aquí surge un problema más serio: si queremos asegurarnos de que los elementos no se repitan, ¿cuál debería ser la base para juzgar si dos elementos se repiten?
Este es el método Object.equals. Sin embargo, si marca una vez cada vez que se agrega un elemento, cuando haya muchos elementos, la cantidad de comparaciones entre los elementos agregados a la colección será muy grande.
En otras palabras, si ahora hay 1000 elementos en la colección, cuando se agregue el elemento 1001 a la colección, llamará al método igual 1000 veces. Obviamente, esto reducirá en gran medida la eficiencia.
Por lo tanto, Java adopta el principio de la tabla hash. Hash es en realidad el nombre de una persona. Debido a que propuso el concepto de algoritmo hash, recibió su nombre.
El algoritmo hash, también conocido como algoritmo hash, asigna directamente datos a una dirección de acuerdo con un algoritmo específico. Si explica el algoritmo hash en detalle, el artículo necesitará más extensión, por lo que no lo presentaré aquí.
Los principiantes pueden comprender que el método hashCode en realidad devuelve la dirección física del almacenamiento del objeto (en realidad, puede que no sea el caso).
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 inmediatamente la ubicación física donde debe colocarse.
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,
Simplemente llame a su método igual para compararlo con el nuevo elemento. Si es el mismo, no se guardará. Si no es el mismo, se aplicarán hash a otras direcciones.
Entonces aquí hay un problema de resolución de conflictos. De esta manera, el número de llamadas reales al método igual se reduce considerablemente, casi sólo una o dos veces.
Por lo tanto, Java proporciona esto para el método eqauls y el método hashCode:
1. Si dos objetos son iguales, entonces sus valores de código hash deben ser los mismos. 2. Si el código hash de dos objetos es el mismo, no son necesariamente iguales. El hecho de que los objetos mencionados anteriormente sean iguales se refiere al uso de comparación. el método de eqauls.
Por supuesto, no es necesario que lo haga 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á considerablemente. El método hashcode se utiliza para determinar si dos objetos son iguales.
Entonces dirías, ¿no existe un método llamado iguales? Sí, estos dos métodos se utilizan para determinar si dos objetos son iguales. Pero son diferentes. En términos generales, el usuario llama al método igual si desea determinar si dos objetos son iguales.
Puede anular el método de igualdad y llamarlo en su código para determinar si son iguales. En pocas palabras, el método de igualdad se utiliza principalmente para determinar si dos objetos son iguales desde la superficie o el contenido. Por ejemplo, hay una clase de estudiantes,
Los únicos atributos son el nombre y el género, por lo que podemos pensar que mientras el nombre y el género sean iguales, los dos objetos son iguales. Los usuarios generalmente no llaman al método hashcode. Por ejemplo, en hashmap, ya que la clave no se puede repetir.
Cuando juzgó si la clave se repitió, juzgó el método del código hash y también usó el método igual. Lo que no se puede repetir aquí es que mientras uno de iguales y el código hash no sean iguales, ¡todo estará bien! En pocas palabras, el código hash es equivalente a la codificación de un objeto, al igual que md5 en un archivo. Se diferencia de igual en que devuelve un tipo int, que en comparación no es intuitivo. Generalmente sobrescribimos el código hash cuando anulamos iguales para que su lógica sea consistente. Por ejemplo,
Siguiendo usando el ejemplo de ahora, si el nombre y el género son iguales, incluso si los dos objetos son iguales, entonces el método del código hash también debería devolver el valor del código hash del nombre más el valor del código hash del género, por lo que, lógicamente, son consistentes. .
Para determinar físicamente si dos objetos son iguales, simplemente use ==