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