Análise do código-fonte HashMap em JDK7 e JDK8

1.jdk1.7 HashMap

A estrutura de dados do hashMap: array + lista encadeada

Valor inicial de ArrayList: 10

Por que não usar o método add da lista em hashMap. HashMap é uma estrutura chave-valor. Ao obter (chave), você precisa percorrer todo o array, o que não é tão eficiente quanto list.get (subscrito).

colocar operação:

1. Use o hashcode para encontrar o comprimento da matriz restante para obter o valor subscrito da matriz de índice

2. Coloque o novo elemento Entry na tabela[índice]

1.1 Método de construção

Método de construção, a memória inicial padrão é 16 e o ​​parâmetro padrão DEFAULT_LOAD_FACTOR=0,75f. Não sei do que adianta, continue analisando

Capacidade inicial padrão: static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
Capacidade máxima padrão: static final int MAXIMUM_CAPACITY = 1 << 30;
Parâmetros padrão: flutuação final estática DEFAULT_LOAD_FACTOR = 0,75f;
/**
     * Constructs an empty <tt>HashMap</tt> with the default initial capacity
     * (16) and the default load factor (0.75).
     */
    public HashMap() {
        this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
    }

1.2 método put (TODO)

A operação de venda é dividida aproximadamente nas etapas a seguir.

1. A capacidade inicial é a potência de 2

2. Coloque-o na primeira posição como vazio

3. Operação de hash e operação para percorrer o valor da chave para obter o valor do valor

4. Julgando as condições para expandir a capacidade, crie uma nova entrada<chave,valor> e coloque-a na matriz entrada[].

^=Operação XOR, o mesmo é 1, diferente é 0

|= A operação AND bit a bit é diferente de 1, e o mesmo é 0 ou 1

&=Bitwise e pós-atribuição é diferente de 0, o mesmo é o mesmo valor

public V put(K key, V value) {
        if (table == EMPTY_TABLE) {
            inflateTable(threshold);//初始化容量为2的冥次方 
        }
        if (key == null)
            return putForNullKey(value);//将null值放入第一个位置
        int hash = hash(key); //hash运算
        int i = indexFor(hash, table.length);//&运算
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {//遍历返回值
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
            }
        }

        modCount++;
        addEntry(hash, key, value, i);//将key,value放入entry
        return null;
    }

 

Acho que você gosta

Origin blog.csdn.net/qq_21575929/article/details/125011803
Recomendado
Clasificación