¿Por qué la longitud de la matriz en HashMap debe diseñarse con una potencia de 2?

  La premisa de comprender este artículo es que debe tener una cierta comprensión de la estructura de datos y comprender las ventajas y desventajas de cada estructura de datos. Por supuesto, si ya sabe que la estructura de datos subyacente de HashMap es matriz + lista vinculada + árbol rojo negro, sería mejor. Si aún sabe que la longitud de la matriz inicializada de hashMap es 16, y cada vez que la capacidad se expande al doble de la longitud original, entonces solo puedo decir "Usted ya es un gángster calificado".

 Soy una persona a la que le gusta descubrir. Creo que "la existencia es significativa", lo que generalmente me hace ganar mucho dinero, pero ocasionalmente es fácil caer en un callejón sin salida. OK Tonterías, ve al tema.

Lo siguiente es parte del código fuente de HashMap en jdk1.8

Inserte la descripción de la imagen aquí

A través del código fuente, podemos ver que los elementos recién agregados de HashMap se calculan mediante la operación de módulo ((longitud de matriz -1) y clave hashCode) (es decir, donde el nuevo elemento debe colocarse en la posición de subíndice de la matriz)

ps: el cálculo del módulo no se explicará aquí, los amigos que quieren saber pueden baidu por sí mismos

El siguiente programa es una simulación simple: cuando la longitud de la matriz es 15, 16, agregue la posición del subíndice calculada por 100 elementos. El código hash correspondiente a estos 100 elementos aumenta de 0 a 100 respectivamente

  public static void main(String[] args) {
            int[] length={15,16};
            for(int n : length){
                System.out.println("--------------"+n+"-----------------");
                for(int hash=0;hash<=100;hash++){
                    System.out.print((hash & n-1)+"\t");
                }
                System.out.println();
            }  
  }
复制代码

Los resultados son los siguientes

Inserte la descripción de la imagen aquí

Se puede ver que cuando la longitud de la matriz es 16, se calculan 16 ranuras y se distribuyen uniformemente en cada posición de la matriz, cuando la longitud de la matriz es 15, solo se calculan 8 ranuras y se coloca cada ranura Una lista vinculada de dos nodos da como resultado que 8 ranuras estén inactivas. Este problema generalmente se conoce como conflicto hash, que puede causar consultas HashMap ineficientes. Cuando recuperamos datos del mapa, podemos extraer directamente el elemento correspondiente a través del espacio calculado por la clave. Ahora, dado que este espacio almacena una lista vinculada, debemos atravesar la lista vinculada para obtener los datos. En el caso de (el código hash de todos los elementos es el mismo), HashMap se degenerará en una lista vinculada. Esto pierde tal característica que la búsqueda aleatoria de matriz es eficiente.

Por lo tanto, hacer que la longitud de la matriz sea igual a la segunda potencia puede reducir efectivamente la probabilidad de colisión de hash.

HashMap también tiene muchas características. Si está interesado, puede consultar JDK para escribir un HashMap usted mismo. ps: 1.7 HashMap es relativamente simple, si desea estudiar el código fuente de HashMap, se recomienda comenzar con jdk1.7

Finalmente, adjunte un simple HashMap blog.csdn.net/qq_39914581...

Supongo que te gusta

Origin juejin.im/post/5e970f8d518825739837c70b
Recomendado
Clasificación