preguntas de la entrevista determinación común HashMap

Hashmap estructura de datos subyacente?

Matriz + lista, lista + + variedad de árbol rojo-negro

principio de acceso HashMap?

Calculado mediante la obtención de un valor de hash objeto hashcode clave del objeto, al cambiar el valor hash y la longitud de la matriz menos 1 bit y operación (n-1 y hash), para dar la posición de los cubos, cuando se produce la colisión de hash, si valor que el valor del viejo valor de la clave será reemplazado, no el mismo valor, entonces el nuevo nodo de lista, cuando la longitud de la lista es más de 8, a continuación convertida en un árbol rojo-negro se almacena.

Java7 y Java8 diferencia?

Crear el objeto antes de jdk1.8, se crea una longitud de entrada 16 [] tabla para almacenar datos clave. Cuando no está en el constructor después de jdk1.8 creados, pero crean sólo cuando la primera llamada para poner el método para crear nodo de la tabla [], y luego se añaden en la lista Java7

Java7 cuando HashMap operativo multi-roscado puede causar un bucle infinito, porque invertir el orden de la lista después de la expansión de la transferencia, modificar la referencia a la relación entre la lista original de los nodos en el proceso de transferencia.

¿Por qué no se enrosque seguro?

Java7 cuando HashMap operativo multi-roscado puede causar un bucle infinito, porque invertir el orden de la lista después de la expansión de la transferencia, modificar la referencia a la relación entre la lista original de los nodos en el proceso de transferencia.

Java8 no causa un bucle infinito en la misma premisa, la razón es la misma antes y después de la expansión de la orden de transferencia de la lista, a las relaciones de nodo de referencia antes de mantenerse.

Pero incluso si no es un bucle infinito, pero a través del código fuente para ver PUT / GET métodos no añaden bloqueo de sincronización, situación multi-roscado es más probable que ocurra: No se puede garantizar el valor del último segundo puesto, la próxima segunda vez u obtener el valor original de modo de hilo de seguridad no está garantizada.

HashMap será de cambio de tamaño operación (expansión), volver a calcular el valor de hash, el tiempo de operación de cambio de tamaño hará que el hilo inseguro. Los siguientes lugares darán dos hilos pueden aparecer inseguro.

1, poner el tiempo de inconsistencias de datos multi-roscados causados.
Este problema es mejor imaginado, por ejemplo, hay dos hilos A y B, de coordenadas deseable un primer índice para insertar una clave-valor pares a la HashMap calculado primera grabación a caer en el cubo, y luego para obtener la cabeza de lista en el interior de la unión bañera punto, en este segmento de tiempo enhebrar una se agota, momento en el que está programado el hilo B para ser ejecutado, y se ejecuta como hilo a, B excepto hilo grabado correctamente en el interior de la cuba, asumiendo un hilo insertado grabación bañera calculado índice y el registro de hilo B a ser insertados índice de cubo se calcula a partir de la misma, a continuación, se inserta con éxito después de hilo B, enhebrar una está programado para ejecutarse de nuevo, que todavía tiene una cabeza de lista expirado, pero no sabía nada al respecto, por lo que cree que debería hacerlo, de esta manera se cubre el registro insertado hilo B, por lo que el subproceso B inserta registro a desaparecer repentinamente, lo que resulta en un comportamiento datos inconsistentes.

2, otra pregunta obvia es hilo HashMap segura la operación de obtención puede provocar un bucle infinito, ya cambio de tamaño (cpu100%), que es una lista enlazada fenómeno referencias circulares (JDK7)

¿Cuáles son la clase thread-safe en vez de él?

currentHashMap 以及 tabla hash

El tamaño de inicialización por defecto? ¿Por qué tantos? ¿Por qué el tamaño es una potencia de 2?

El tamaño predeterminado es de 16 inicialización La razón es la siguiente, si la configuración cubo cubo gama de inicialización también, será un desperdicio de espacio de memoria, 16 es el tamaño de un compromiso, ni puso en algunos elementos, tales como 1,2,3 expansión , también no como las decenas de miles que sólo se puede utilizar un poco de espacio con el fin de causar una gran cantidad de residuos.

El tamaño es una potencia de dos es que en el cálculo de los cubos de la posición de cubo, la fórmula es ((n-1) y hash), el final de una potencia de 2 menos 1 en el número binario es 1, con el cálculo del valor de hash , obtendrá el resto del número. AND bit a bit operación resultado de manera que el valor restante del objeto al final de varios valores hash, siempre y cuando nos valor hash hash del objeto de generar suficientes

La eficiencia de la memoria, a minimizar las colisiones, la ((n-1) y hash) de índice cuando la búsqueda de una más uniforme

longitud de la matriz es poder 2 n

Cuando la longitud de la matriz no es una potencia de 2, n

HashMap modo de expansión? El factor de carga es ¿cuánto? ¿Por qué tantos?

El factor de carga se establece en 0,75 en lugar de 1, ya que el conjunto es demasiado grande, mayor será la clave para la posibilidad de un cubo colisión con un cubo de posición puede almacenarse Valor Valor varios, lo que aumenta el tiempo de búsqueda, la degradación del rendimiento , juego demasiado pequeño ni apropiada si es 0,1, entonces 10 barriles, umbral 1, debe poner la expansión pares clave-valor de dos, un desperdicio de espacio.

¿Cuáles son los principales parámetros de la HashMap?

    //默认的map大小,为2的n次幂
    static final int DEFAULT_INITIAL_CAPACITY(默认初始容量) = 1 << 4; // aka 16

   // 最大容量,指定的值超过 2的30次幂,默认使用这个值
    static final int MAXIMUM_CAPACITY (最大容量)= 1 << 30;

   //在构造函数中没有指定时使用的负载因子
    static final float DEFAULT_LOAD_FACTOR = 0.75f;

   //当链表长度为8时,使用以红黑树代替链表,红黑树的结点是链表长度的两倍,当比较短的时候,使用红黑树的效率其实并不高,根据泊松分布公式的统计结果,在结点数达到8时,适合使用红黑树
    static final int TREEIFY_THRESHOLD(恐吓的阈值) = 8;
  
// 红黑树转为链表的阈值
    static final int UNTREEIFY_THRESHOLD (非恐吓的阈值)= 6;

//链表转红黑树时数组的大小的阈值,即数组大小大于这个数字时且链表长度大于8才会转为红黑树,
//在数组长度小于64,不会转,而是进行扩容
    static final int MIN_TREEIFY_CAPACITY = 64(小的恐吓容量);

HashMap es cómo hacer frente a la colisión de hash?

Si la misma clave, la clave de contenido correspondiente al valor más mínimo será reemplazado, no la misma clave, a la parte posterior de la lista, si la longitud de la longitud de cadena de 8 y alcanza la matriz es mayor que 64, entonces la lista vinculada en un árbol rojo-negro, si la matriz menos de 64, se realiza la expansión

hash de regla de cálculo?

El código hash objeto () devuelve un valor hash, una de 16 bits sin signo de desplazamiento a la derecha, y con los valores de hash originales bit a bit operación XOR, el objetivo es hash de la baja y de 16 bits de alta 16bit realizó una O exclusiva, devolver valores para discutir una suficiente

Obtener y poner en el proceso, el cálculo del índice, realiza la operación de comprobación aleatoria hashCode en primer lugar, y luego calcular el valor hash por una norma adicional, como se muestra a continuación:

¿Cómo resolver el valor de inicialización, no entran en la enésima potencia de 2

    /**
     * Returns a power of two size for the given target capacity.
     */
    static final int tableSizeFor(int cap) {
        int n = cap - 1;
        n |= n >>> 1
        n |= n >>> 2;
        n |= n >>> 4;
        n |= n >>> 8;
        n |= n >>> 16;
        return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
    }

Objetivo: Los valores binarios, la primera aparición de un comienzo de izquierda a derecha, todos los valores de la derecha se han convertido en 1, por lo que es posible descubrir la enésima potencia que el valor actual del estudiante de primer año poco número 2

Al realizar n >>> 16, lo que significa que 32 bits se han llevado a cabo una operación OR, una

Supongo que te gusta

Origin www.cnblogs.com/chenhanhao/p/12469796.html
Recomendado
Clasificación