Aquellos Sao bit operaciones de cálculo, la capacidad HashMap ¿Por qué es el poder de 2?

BitWise mostrar estas operaciones, el número de menos, que tomó se obtiene HashMap cuando la posición del elemento se calcula h & (longitud-1) en, h es el valor clave hash, la longitud es la longitud de la matriz. Sin embargo, el tamaño de la longitud está limitada, debe ser una potencia de dos. ¿Por qué es 2 a la potencia de la misma? De hecho, esto es bastante fácil de entender.

En primer lugar debemos saber y reglas, es decir, ambos a 1, el resultado de una sola, de la siguiente manera:

Entonces sabes la ley de la potencia binaria de 2, se encuentran al principio de 1, el resto son todos cero.

 public static void main(String[] args) {
     for (int i = 0; i < 10; i++) {
         toBin((int)Math.pow(2,i+1));
     }
 }
 private  static  void toBin(int n){
     System.out.println(Integer.toBinaryString(n)) ;
 }

A continuación, de acuerdo con las reglas de cálculo de hash y HashMap (longitud-1), longitud (una potencia de 2) -1 después de la ley es tal, oh, Dios mío, realmente sorprendente regularidad. Los resultados son todos 1.

 public static void main(String[] args) {
     for (int i = 0; i < 10; i++) {
         toBin((int)Math.pow(2,i+1)-1);
     }
 }
 private  static  void toBin(int n){
     System.out.println(Integer.toBinaryString(n) +"  十进制=="+ n) ;
 }

Ahora se puede dar un ejemplo del cálculo, si h = 456, longitud = 16, entonces, calcula una capa final es un binario, 8, este elemento se coloca en la posición 8 del índice.

Este tiempo será capaz de encarnar la esencia, y si el número de hash y (en lugar de 2 potencia -1), tales como 14 y en, y que el resultado final es que, aunque el resultado es 8. Al parecer, no hay problema. En realidad no es el caso, 14 el último bit es 0, que significa que no importa cómo los valores de hash trastorno, el valor calculado final no puede ser un 1, ha llevado a una posición de índice de matriz 1 nunca poner menos valor. En el ejemplo, 11 es el binario de 1011, a continuación, a partir de la 0, desechando todo izquierda, a la derecha, siempre que el primero uno con el número 1 no deben ser tomadas como 100 (4), 101 (5) , 110 (6), 111 (7). Este es el espacio de cuatro a perder.


Quizás con el siguiente segmento de código puede ser bien explicados. El valor se puede encontrar bien distribuidas.

public static void main(String[] args) {
    int size =16;
    for (int i = 0; i < 10; i++) {
        int r =new Random().nextInt(Integer.MAX_VALUE);
        System.out.println((size-1)&r);
    }
}


Sin embargo, como Hash y (no es una potencia de 2 -1) se calcula, el resultado es este. valor atroz

  public static void main(String[] args) {
      int size =16;
      for (int i = 0; i < 10; i++) {
          int r =new Random().nextInt(Integer.MAX_VALUE);
          System.out.println((size)&r);
      }
  }

En resumen, debe ser una potencia de dos, es para asegurar que la operación en tiempo real, los bits son 1, reducir las colisiones, la distribución uniforme de algunas posiciones. Por supuesto% también puede calcular la posición del índice, pero es un poco eficiencia informática que% más rápido, y la gente por qué no pedir un múltiplo de 2, de hecho, mediante el cálculo de lo anterior, el número binario es un múltiplo de 2 puede tener un bit es 0, por lo el índice se calcula, entonces alguna posición o no puede poner los datos, si las palabras son todas de 1 no lo es.

Debe ser una potencia de 2 y arroja otro problema, ¿por qué la expansión es 2 veces el original? Que entienden mejor, tal vez más capaces de explicar esta animación, el futuro sigue llenando 0, que es dos veces mayor que el número original, que a su vez bits de garantía de longitud completa-1-1.

Publicado 49 artículos originales · ganado elogios 9 · vistas 8625

Supongo que te gusta

Origin blog.csdn.net/HouXinLin_CSDN/article/details/104897818
Recomendado
Clasificación