La idea básica de HashMap
es la siguiente:
- Un
HashMap
es realmente una matriz de objetos especiales que sujetan tanto clave y valor.
- La matriz tiene una cierta cantidad de cubos (ranuras), digamos 16.
- El algoritmo hash es proporcionado por el método
hashCode()
que tiene cada objeto. Por lo tanto, cuando escriba un nuevo Class
, debe encargarse de la implementación correcta de los métodos hashCode()
y equals()
. El predeterminado (de la clase Object
) toma el puntero de memoria como un número. Pero eso no es bueno para la mayoría de las clases que nos gustaría usar. Por ejemplo, la clase String
utiliza un algoritmo que crea el hash de todos los caracteres de la cadena; piénselo de esta manera: hashCode = 1.char + 2.char + 3.char...
(simplificado). Por lo tanto, dos cadenas iguales, aunque se encuentren en una ubicación diferente en la memoria, tienen el mismo hashCode()
.
- El resultado de
hashCode()
, digamos "132", es el número de cubeta donde debería guardarse el objeto si tuviéramos una matriz tan grande. Pero no lo hacemos, la nuestra tiene solo 16 cubos de largo. Por eso, utilizamos el cálculo obvio 'hashcode % array.length = bucket'
o '132 mod 16 = 4'
y almacenar el par clave-valor en un número cubo 4.
-
- Si no hay otro par sin embargo, está bien.
- Si hay uno con clave igual a la clave que tenemos, eliminamos el anterior.
- Si hay otro par de clave-valor (colisión), encadenamos el nuevo después del anterior en una lista vinculada.
- Si la matriz de respaldo se llena demasiado, tendremos que hacer demasiadas listas enlazadas, crearemos una nueva matriz con longitud doble, repetiremos todos los elementos y los agregaremos a la nueva matriz, luego disponemos de la el viejo.Es muy probable que esta sea la operación más costosa en
HashMap
, por lo que debe indicarle a su Maps
cuántos cubos utilizará si ya lo conoce.
- Si alguien trata de obtener un valor, proporciona una clave, la modificamos, la modificamos y luego revisamos la lista potencial de enlaces para la coincidencia exacta.
An image, courtesy of Wikipedia: 
En este caso,
- hay una matriz con 256 cubos (numerados, por supuesto, 0-255)
- hay cinco personas. Sus hashcodes, después de pasar por
mod 256
, apuntan a cuatro ranuras diferentes en la matriz.
- se puede ver que Sandra Dee no tenía una ranura libre, por lo que ha sido encadenada después de John Smith.
Ahora, si intentas buscar un número de teléfono de Sandra Dee, deberías tachar su nombre, modificarlo por 256, y buscar en el cubo 152. Allí encontrarás a John Smith. Esa no es Sandra, mira más allá ... aha, Sandra está encadenada detrás de John.
Si encuentra un enlace que explique las imágenes, por favor póngalo aquí ... Eso será muy útil. – Sahal
Listo. Es de [este artículo en wikipedia] (http://en.wikipedia.org/wiki/Hash_table#Separate_chaining_with_list_heads). –
Y ahora, cuando sabes esto, [esta es la implementación de 'hashCode()' real de 'String'] (http://docs.oracle.com/javase/7/docs/api/java/lang/ String.html # hashCode% 28% 29). [Y] (http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier) [some] (http://stackoverflow.com/ questions/1835976/what-is-a-sensible-prime-for-hashcode-calculation) [random] (http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode) enlaces en la selección del número principal en 'hashCode()'. –