English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Explicação detalhada da expansão do HashMap no Java e exemplo de código

Expansão do HashMap

Introdução:

O size do HashMap é maior ou igual a(Capacidade*Fator de carga) desencadeia a operação de expansão, o que é uma operação de custo significativo.

Por que expandir?63;A capacidade padrão do HashMap é16, à medida que elementos são adicionados ao HashMap, a probabilidade de conflito de hash aumenta, então a lista correspondente a cada pote será mais longa,

Isso afetará o desempenho da consulta, porque é necessário percorrer a lista toda, comparar os objetos até encontrar o elemento.

Para melhorar o desempenho da consulta, é necessário expandir, reduzir o conflito de hash e distribuir uniformemente as chaves dos elementos.

Ponto de expansão

O valor padrão do fator de carga é 0.75

static final float DEFAULT_LOAD_FACTOR = 0.75f;

O valor padrão da capacidade é16

 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // =16

HashMap oferece um parâmetro de construção, que pode especificar a capacidade e o fator de carga ao criar.

 public HashMap(int initialCapacity, float loadFactor)

Pelo padrão, quando o size do HashMap for maior ou igual a16*0.75=12então,

ao mesmo tempo, cada Entry (ou chamada de pote) deve ter pelo menos um elemento para que a expansão seja feita.

 se ((size >= threshold) && (null != table[bucketIndex])) {
      resize(2 * table.length);
      hash = (null != key) ? hash(key) : 0;
      bucketIndex = indexFor(hash, table.length);
}

ao expandir, a capacidade do contêiner é dobrada

 resize(2 * table.length);

ao expandir, é necessário recalcular o índice do elemento no array

1、atribuir um novo array Entry
2、recalcular o índice do elemento original no novo array(Muito consumidor de recursos)

Obrigado por ler, espero que ajude a todos, obrigado pelo apoio ao site!

Você também pode gostar