Análisis del código fuente de HashMap en JDK7 y JDK8

1.jdk1.7 mapa hash

La estructura de datos de hashMap: matriz + lista enlazada

Valor inicial de ArrayList: 10

¿Por qué no usar el método add de list en hashMap? HashMap es una estructura clave-valor. Al obtener (clave), debe recorrer toda la matriz, lo que no es tan eficiente como list.get (subíndice).

poner operación:

1. Use el código hash para encontrar la longitud de la matriz restante para obtener el valor de subíndice de la matriz de índice

2. Coloque el nuevo elemento de entrada en la tabla [índice]

1.1 Método de construcción

Método de construcción, la memoria inicial predeterminada es 16 y el parámetro predeterminado DEFAULT_LOAD_FACTOR=0.75f. No se de que sirve, sigue analizando

Capacidad inicial predeterminada: int final estático DEFAULT_INITIAL_CAPACITY = 1 << 4;
Capacidad máxima predeterminada: static final int MAXIMUM_CAPACITY = 1 << 30;
Parámetros predeterminados: flotante final estático 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 poner (POR HACER)

La operación de venta se divide aproximadamente en los siguientes pasos.

1. La capacidad inicial es la potencia de 2

2. Ponlo en la primera posición como vacío

3. Operación hash y operación para atravesar el valor clave para obtener el valor del valor

4. Juzgando las condiciones para expandir la capacidad, cree una nueva entrada <clave, valor> y colóquela en la matriz de entrada [].

^=Operación XOR, lo mismo es 1, no lo mismo es 0

|= La operación AND bit a bit es diferente a 1, y lo mismo es 0 o 1

&=Bitwise y post-asignación es diferente a 0, el mismo es el mismo 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;
    }

 

Supongo que te gusta

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