HashMap de la clave y el valor puede estar vacío, y ConcurrentHashMap HashTable no, ¿por qué

escenarios

HashMap no es hilo de seguridad, por lo que bajo utilizarse en escenarios de un único subproceso
ConcurrentHashMap y HashTable son thread-safe, escenarios multiproceso aplican bajo

La razón de la diferencia

Cuando se llama a get (clave), si el valor de retorno está vacía, se puede determinar este valor se almacena es clave null o porque no hay retorno.

razón

HashMap

Debido a que la aplicación de un solo roscado es HashMap escenario, en el código fuente, cuando es clave determinada está vacía, la tabla valor almacenado [0] a.
Cuando el valor está vacío, por containsKey ** (clave) ** determina si una clave, si es así, entonces el valor de retorno de null está vacío, si no la clave, a continuación, devolver null la clave no está vacía .
Cuando la llave almacenado y el valor están vacías, containsKey (clave) también devuelve verdadero, que no Nodo tabla de nodos (atributo de nodo de clave y el valor son null)

HashTable 和 ConcurrentHashMap

Debido a que los dos conjuntos se aplican a escenarios multiproceso, durante el uso del containsKey (clave) dos métodos y GET (clave), puede haber un valor de clave para otros hilos de modificar, de manera que, después de la vuelta verdadero containsKey (clave) otro hilo va a eliminar la clave, esta vez en nombre de la nula get retorno (llave) no es la clave, pero el hilo, pero pensó que era valor está vacío, hay un conflicto.

¿Por qué clave de venta no puede ser nulo, posiblemente para corresponder al valor, ya que el valor no puede ser nulo, y la clave es nula y no evitan nada excepción inesperada.
(Fuente código como este, no encuentra ninguna razón concreta, en su caso, se pueden hacer de bienvenida Gangster)

código

import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap;

public class TestMap {
    public static void main(String[] args){
        HashMap<Integer,Integer> map = new HashMap<>();
        System.out.println(map.containsKey(null));
        System.out.println(map.get(null));

        map.put(null,null);//当key为空时,key的hash值为0
        System.out.println(map.containsKey(null));
        System.out.println(map.get(null));

        map.put(null,123);
        System.out.println(map.containsKey(null));
        System.out.println(map.get(null));

        ConcurrentHashMap<Integer,Integer> cmap = new ConcurrentHashMap<>();
        System.out.println(cmap.containsKey(null));
        System.out.println(cmap.get(null));

        cmap.put(null,123);
        cmap.put(123,null);

    }
}

Salida: Desde containsKey (clave) a excepción de inicio.

falso
nulo
cierto
nula
verdadera
123
Excepción en hilo “principal” java.lang.NullPointerException
en java.util.concurrent.ConcurrentHashMap.get (ConcurrentHashMap.java:936)
en java.util.concurrent.ConcurrentHashMap.containsKey (ConcurrentHashMap.java:964 )
en TestMap.main (TestMap.java:21)
Proceso de acabado con código de salida 1

Publicado 12 artículos originales · ganado elogios 0 · Vistas 192

Supongo que te gusta

Origin blog.csdn.net/N_a_n/article/details/105025242
Recomendado
Clasificación