El principio de colecciones de Java -HashMap

1.HashMap obras  

  Cuando Hashmap hora de poner en elementos, el primero vale basada en la clave hash para la posición del elemento de la matriz (es decir, el subíndice), entonces podemos poner este elemento en la posición correspondiente a la. Si este elemento en el asiento donde se han almacenado los otros elementos (dos de entrada clave de hashCode () devuelve el mismo valor que se produjo la colisión de hash), devuelve verdadero si la comparación de los dos de entrada clave por los iguales, el recién agregado la entrada de valor cubrirá el cobro de la entrada original de valor; falsa devolución si la comparación de estos dos entrada clave por los iguales, entonces se almacenarán los elementos en los asientos misma lista en la forma, el Java 1.7 y versiones anteriores utilizando el primer método de interpolación, java1.8 cola comenzó a utilizar la interpolación. Y en java1.8, si la longitud de la cadena supera un valor umbral (TREEIFY UMBRAL == 8), puesta en una lista de árbol a su vez rojo-negro, menor que la longitud de la cadena 6, árbol rojo-negro puso lista espalda. Si el cubo está lleno (factor de carga de capacidad 16 * 0,75), necesitamos cambiar el tamaño (expansión 2 veces después de reordenamiento)
  Entonces llamamos al método get (), el objeto HashMap utiliza código hash posición clave hallazgo cubo, encontramos la posición de cuchara, se llame keys.equals () para encontrar el nodo correcto en la lista, y en última instancia que encontramos el valor del objeto. A partir de aquí podemos imaginar, si cada posición en la lista de un solo elemento, entonces el HashMap obtendrá la más alta eficiencia, pero lo ideal es siempre bueno, la realidad es siempre una necesidad de nosotros para superar las dificultades.

2.HashMap capacidad de 2 a la potencia de la razón

  En primer lugar, el algoritmo de hash aspecto, podemos ver en HashMap desea encontrar un elemento, es necesario obtener la ubicación correspondiente en la matriz basada en el valor hash de la clave. Esta es la forma de calcular la posición del algoritmo hash. Que precede a dicha estructura de datos es una combinación de matrices y la lista de HashMap vinculado, por supuesto, esperamos una distribución uniforme de las posiciones de estos elementos Hashmap el interior, en la medida de lo posible para que el número de elementos en cada posición es sólo uno, entonces cuando nos encontramos con un algoritmo de hash cuando esta posición, se puede saber de inmediato la ubicación de los elementos correspondientes de lo que queremos, y no tener que recorrer la lista. 

Por lo tanto, lo primero que pensamos que la longitud de la operación de módulo array código hash, de modo que la distribución de los elementos es relativamente uniforme. Sin embargo, el "modo" de consumo de la operación es bastante grande, no se puede encontrar un más rápido, consumen menos de esa manera? java que hacer cuando algo como esto:

1  estática  int indexFor ( int h, int longitud) {  
 2         retorno h & (longitud-1 );  
3     }

  Tener código hash calculado primer valor de clave, y luego hacer una "y" el funcionamiento (y) con la longitud de la matriz -1. Parece muy simple, de hecho, tiene más misterio. 4 tales como longitud de la matriz es una potencia de 2, entonces la cuarta potencia y tendrá HashCode -12 hacer "y" la operación. Muchas personas tienen esta pregunta, ¿por qué el tamaño HashMap la inicialización del campo es el tamaño de la potencia de 2, Hashmap el más eficiente, en mi 4ª potencia de 2, por ejemplo, para explicar por qué el tamaño de la matriz es una potencia de dos accesos HashMap el más alto rendimiento. 

        Ver la figura, a la izquierda es una matriz de longitud dos (la cuarta potencia de 2) 16, la longitud correcta de la matriz 15 es de dos. grupos HashCode son 8 y 9, es evidente que cuando y 1110 cuando el "AND", produjo los mismos resultados, es decir, que serán colocados en la misma posición en la matriz, lo cual resultó en una colisión , 8 y 9 serán colocados en la misma lista, entonces la consulta cuando se necesita para recorrer la lista, obtener 8 o 9, lo que reduce la eficiencia de la consulta. Al mismo tiempo, también se encontró que cuando la longitud de la matriz es 15 cuando se llevará al valor de la código hash a cabo con 14 (1110) "y" a continuación, la última es siempre 0, y 0001,0011,0101,1001,1011,0111, 1101 ubicación de estos elementos nunca será almacenado, y un considerable desperdicio de espacio, o peor aún, este es el caso, la posición de la matriz se puede utilizar mucho más pequeñas que la longitud de la matriz, lo que significa que aumenta aún más las posibilidades de un accidente, más lento eficiencia de la consulta!

  

 

 

   Así que, cuando una matriz de longitud n-ésima potencia de 2, cuando una clave diferente considerado menos propensos a tener el mismo índice, entonces los datos se distribuye en una matriz de relativamente uniforme, que es una pequeña probabilidad de colisiones, relativo, consulta cuando sin recorrer la lista en un lugar, por lo que la eficiencia de la consulta también mayor. 
          Aquí, miramos hacia atrás en HashMap el tamaño predeterminado de la matriz es el número, ver el código fuente que puede ser de 16, ¿por qué es 16, no 15, no 20, sin embargo, después de la annegu explicación, se ve claramente que, al parecer porque 16 es la razón número entero potencia de 2, en el caso de una pequeña cantidad de datos de 16 a 15 y 20 y ayuda a reducir la colisión entre la llave, y mejorar la eficacia de las consultas. 

3.HashMap 的 cambio de tamaño

  A medida que más y más de los elementos de tiempo HashMap, la probabilidad de colisión es más y más alta (debido a que la longitud de la matriz es fija), por lo que con el fin de mejorar la eficiencia de las consultas, es necesario llevar a cabo una serie de expansión HashMap, esta matriz de expansión operación también aparece en el ArrayList, por lo que esta es una operación común, mucha gente dudaba de su rendimiento, pero pensar en nuestro principio "compartida por igual", a gusto, y después de la expansión del array hashMap, más el rendimiento del consumo el punto apareció: los datos originales de la matriz debe volver a calcular su posición en la nueva matriz, y en ellos, que es de tamaño. 

        Así que cuando HashMap para la expansión de la misma? Cuando el número de elementos sea superior hashmap * tamaño de la matriz loadFactor, la matriz será la expansión, el valor predeterminado loadFactor es 0,75, que es, por defecto, el tamaño de la matriz 16, a continuación, cuando el número de elementos sea superior hashmap 16 * 12 = 0,75 veces, el tamaño de la matriz se pone extendida 2 * 16 = 32, es decir, un doble, y luego re-calcula la posición de cada elemento de la matriz, que es una operación de funcionamiento lento, por lo que si tenemos hashMap predecir el número de elementos, entonces el número de pre-conjunto de elementos puede mejorar efectivamente el rendimiento de hashMap. Por ejemplo, tenemos 1000 elementos nuevo HashMap (1000), pero en teoría nueva HashMap (1024) es más apropiado, pero por encima de annegu haber dicho, incluso 1000, hashmap ajusta automáticamente a 1.024. Pero el nuevo HashMap (1024) no es más apropiado, ya que 0,75 * 1,000 <1,000, es decir, con el fin de permitir a 0,75 tamaño *> 1000, por lo que necesitamos un nuevo HashMap (2048) fue el más apropiado, teniendo en cuenta tanto y el problema, evitar problemas de tamaño. 

Supongo que te gusta

Origin www.linuxidc.com/Linux/2020-03/162763.htm
Recomendado
Clasificación