Será una respuesta larga, tomar un trago y seguir leyendo ...
El hash consiste en almacenar un par clave-valor en la memoria que se puede leer y escribir más rápido. Almacena claves en una matriz y valores en LinkedList.
Digamos que quiero almacenar 4 pares de valores clave:
{
“girl” => “ahhan” ,
“misused” => “Manmohan Singh” ,
“horsemints” => “guess what”,
“no” => “way”
}
Entonces, para almacenar las claves necesitamos una matriz de 4 elementos. Ahora, ¿cómo asigno una de estas 4 claves a 4 índices de matriz (0,1,2,3)?
Entonces, Java encuentra el código hash de claves individuales y las asigna a un índice de matriz particular. Hashcode Formulas es -
1) reverse the string.
2) keep on multiplying ascii of each character with increasing power of 31 . then add the components .
3) So hashCode() of girl would be –(ascii values of l,r,i,g are 108, 114, 105 and 103) .
e.g. girl = 108 * 31^0 + 114 * 31^1 + 105 * 31^2 + 103 * 31^3 = 3173020
Hash y niña !! Sé lo que estás pensando. Tu fascinación por ese dúo salvaje podría hacerte perder algo importante.
¿Por qué Java lo multiplica por 31?
Es porque 31 es un primo impar en la forma 2 ^ 5 - 1. Y la prima impar reduce la posibilidad de colisión de hash
Ahora, ¿cómo se asigna este código hash a un índice de matriz?
respuesta es, Hash Code % (Array length -1)
. Entonces “girl”
se asigna a(3173020 % 3) = 1
en nuestro caso. que es el segundo elemento de la matriz.
y el valor "ahhan" se almacena en una LinkedList asociada con el índice de matriz 1.
HashCollision : si intenta encontrar hasHCode
las claves “misused”
y “horsemints”
utiliza las fórmulas descritas anteriormente, verá que ambas nos dan lo mismo 1069518484
. Whooaa !! lección aprendida -
2 objetos iguales deben tener el mismo código hash pero no hay garantía de que el código hash coincida, entonces los objetos son iguales. Por lo tanto, debe almacenar los valores correspondientes a "mal uso" y "horsemints" en el depósito 1 (1069518484% 3).
Ahora el mapa hash se ve así:
Array Index 0 –
Array Index 1 - LinkedIst (“ahhan” , “Manmohan Singh” , “guess what”)
Array Index 2 – LinkedList (“way”)
Array Index 3 –
Ahora, si algún cuerpo intenta encontrar el valor de la clave “horsemints”
, Java encontrará rápidamente el código hash de la misma, lo modulará y comenzará a buscar su valor en la lista correspondiente.index 1
. De esta manera, no necesitamos buscar en los 4 índices de la matriz, lo que hace que el acceso a los datos sea más rápido.
Pero espera, un segundo. hay 3 valores en esa lista enlazada correspondiente al índice de matriz 1, ¿cómo descubre cuál era el valor para las "mentas" clave?
En realidad mentí, cuando dije que HashMap solo almacena valores en LinkedList.
Almacena ambos pares de valores clave como entrada de mapa. Entonces, en realidad, Map se ve así.
Array Index 0 –
Array Index 1 - LinkedIst (<”girl” => “ahhan”> , <” misused” => “Manmohan Singh”> , <”horsemints” => “guess what”>)
Array Index 2 – LinkedList (<”no” => “way”>)
Array Index 3 –
Ahora puede ver que mientras recorre la lista enlazada correspondiente a ArrayIndex1, en realidad compara la clave de cada entrada de esa lista enlazada con "horsemints" y cuando encuentra una, simplemente devuelve el valor de la misma.
Espero que te hayas divertido mientras lo leías :)