entender
El propósito de hashcode () es obtener el código hash, también conocido como el código hash; En realidad devuelve un intero int. La función de este código hash es determinar la posición de índice del objeto en la tabla hash.
hashcode () se define en el objeto.java de JDK, lo que significa que cualquier clase en Java contiene la función hashcode ().
Aunque, cada clase Java contiene una función hashcode (). Sin embargo, el hashcode () de la clase solo es útil al crear y crear una "tabla hash" (consulte la descripción a continuación para ver la "tabla hash") (la función es determinar la posición de cada objeto de la clase en la tabla hash; en otros casos (por ejemplo, crear un solo objeto de la clase, o crear una variedad de objetos de la clase, etc.), el hashcode () () de la clase hahcodo () no tiene efecto.
La lista hash anterior se refiere a: clases en colecciones de Java que son esencialmente listas de hash, como hashmap, hashtable y hashset.
En otras palabras: hashcode () solo es útil en las listas de hash, pero es inútil en otros casos. La función de hashcode () en una tabla hash es obtener el código hash del objeto y luego determinar la posición del objeto en la tabla hash.
Todos sabemos que una tabla hash almacena pares de valores clave, que se caracterizan por: puede recuperar rápidamente los "valores" correspondientes basados en "claves". ¡Esto usa código hash!
La esencia de una tabla hash se implementa a través de una matriz. Cuando queremos obtener un cierto "valor" en una tabla hash, en realidad queremos obtener el elemento en una determinada posición en la matriz. La posición de la matriz se obtiene por "clave"; Además, la posición de la matriz es calculada por el código hash correspondiente a la "clave".
A continuación, tomaremos hashset como un ejemplo para explicar en profundidad el papel de hashcode ().
Supongamos que ya hay 1000 elementos en el hashset. ¿Qué debo hacer al insertar el elemento 1001? Debido a que hashset es una colección establecida, permite elementos duplicados.
"Compare el elemento 1001 uno por uno con los 1000 elementos anteriores"? Obviamente, esta eficiencia es igualmente ineficiente. La tabla hash resuelve este problema muy bien. Calcula la posición del elemento en la tabla hash basada en el código hash, y luego inserta el elemento en esa posición. Para el mismo elemento, naturalmente, solo uno se guarda.
De esto podemos ver que si dos elementos son iguales, sus códigos hash deben ser iguales; Pero al revés no lo es. En una mesa de hash,
1. Si dos objetos son iguales, entonces sus valores hashcode () deben ser los mismos;
2. Si los dos objetos hashcode () son iguales, no son necesariamente iguales.
Nota: Este es el caso en las tablas hash. ¡Esto debe ser cierto en las listas no hash!
Ejemplo
Echemos un vistazo a un ejemplo específico.
clase pública hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } public int hashcode () {return i % 10; } public Final Final static void main (string [] args) {hashtest a = new Hashtest (); Hashtest b = nuevo hashtest (); a.seti (1); B.Seti (1); Set <S HashTest> set = new Hashset <S HashTest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.hashcode ()); System.out.println (a.equals (b)); System.out.println (set); }}El resultado de esta salida:
Verdadero Falso [com.ubs.sae.test.hashtest@1, com.ubs.sae.test.hashtest@1]
En el ejemplo anterior, solo reescribimos el método hashcode. De los resultados anteriores, podemos ver que, aunque los hashcodes de los dos objetos son iguales, los dos objetos en realidad no son iguales;, no reescribimos el método igual, y luego llamaremos el método iguales predeterminados del objeto para comparar si las referencias de los dos objetos son las mismas, y muestra que estos son dos objetos diferentes, y las referencias de los dos objetos son definitivamente inseguros. Aquí colocamos el objeto generado en el hashset, y solo el objeto único se puede almacenar en el hashset, es decir, el mismo objeto (aplicable al método igual) solo almacenará uno, pero aquí, en realidad, hay dos objetos A y B que se colocan en el hashset, por lo que el hashset pierde su propio significado.
En este momento, agregamos el método igual:
clase pública hashtest {private int i; public int geti () {return i; } public void seti (int i) {this.i = i; } <span style = "color:#3366ff;"> <strong> public boolean iguales (objeto objeto) {if (object == null) {return false; } if (objeto == this) {return true; } if (! (Object instanceOf hashtest)) {return false; } Hashtest otro = (hashtest) objeto; if (otro.geti () == this.geti ()) {return true; } return false; } </strong> </span> public int hashcode () {return i % 10; } public Final Final static void main (string [] args) {hashtest a = new Hashtest (); Hashtest b = nuevo hashtest (); a.seti (1); B.Seti (1); Set <S HashTest> set = new Hashset <S HashTest> (); set.add (a); set.add (b); System.out.println (a.hashcode () == B.hashcode ()); System.out.println (a.equals (b)); System.out.println (set); }}Los resultados obtenidos en este momento serán los siguientes:
True True [com.ubs.sae.test.hashtest@1]
De los resultados, podemos ver que los dos objetos ahora son completamente iguales, y solo un objeto se almacena en el hashset.
Resumir
1. La existencia de hashcode se usa principalmente para buscar la solidez, como hashtable, hashmap, etc. El cóndo se utiliza para determinar la dirección de almacenamiento de un objeto en la estructura de almacenamiento hash;
2. Si los dos objetos son los mismos, es aplicable al método igual (java.lang.object), entonces los hashcodes de estos dos objetos deben ser los mismos;
3. Si el método igual del objeto se reescribe, entonces el húsico del objeto también debe reescribirse tanto como sea posible, y el objeto utilizado por hashcode debe ser consistente con el mismo que el método igual, de lo contrario, violará el segundo punto mencionado anteriormente;
4. El húsico de dos objetos es el mismo, lo que no significa necesariamente que los dos objetos son los mismos, es decir, no necesariamente se aplica al método igual (java.lang.object). Solo puede indicar que estos dos objetos están en una estructura de almacenamiento hash, como la hashtable, y están "almacenados en la misma canasta".