Entrevista essencial: HashMap subjacente estrutura de dados? algoritmo de otimização jdk1.8, o conflito de hash, expansão e outras questões

série de entrevistas não será necessário verificar a teoria de longa, a resposta direta, apenas para referência, não como não spray.

1, vai falar sobre os princípios subjacentes HashMap não?

HashMap<String,String> map = new HashMap<String,String>(); 

map.put(“key”,”value”); 

[<key1,value1>,<key2,value2>,<key3,value3>] 

+ HashMap subjacente lista de implementação é um array para armazenar o <chave, valor> na forma de dados, quando chamamos colocar (chave, valor) , a primeira chave pode ser adquirido pelo valor de hash de haxixe (key), o valor hash do comprimento da matriz operação de módulo, para localizar um local de armazenamento matriz balde, se não houver um conflito, então balde directamente para a matriz, em seguida, a lista de conflito de lugares armazenado, após a introdução de jdk1.8 árvore-preto vermelho, do que o comprimento da lista 8 será usado depois de a árvore vermelha-preta, e, em seguida, de volta convertido para menos do que 6.

2,3 tira são os seguintes suplemento artigo 1, prevenção fina para pedir ao entrevistador.

2, jdk1.8 otimização algoritmo para algoritmo de hash e endereçamento

jdk1.8 do algoritmo hash é optimizada, antes de quando a chave de hash ser (chave) é calculada, utilizando a operação de módulo, isto é referido no artigo 1, e é utilizada no tratamento do algoritmo optimizado, ou seja: (n-1) e de hash "N é o comprimento da matriz."

Por que usar algoritmos para lidar com isso? Primeiro " Hash e (n-1) " com efeito de hash módulo n efeito é o mesmo, mas o desempenho "&" e a operação é superior ao de hash módulo n.

3, o conflito de hash? Como resolver?

Quando colocar <chave, valor> , valor de hash primeira calculado pelo hash (chave), e em seguida mais tarde por "&" e operação, tem sido uma série de locais de armazenamento balde, mas neste momento houve dois chave diferente foi calculado igual ao balde, por exemplo:

数组A[0]位置计算出存放<张三,我是张三>数据,而在put<李四,我是李四>数据时,也计算为存放在A[0]位置,一个位置想存放两个数据?这就出现hash冲突了,怎么处理呢?

JDK是这样处理的,它会在这个位置(A[0])挂一个链表,这个链表表里面存放出现冲突的数据,即:让多个<key,value>数据同时放在数组的一个位置里。

get(key)时怎么取呢?当我们调用get(key)定位到数组位置时,如果发现这个位置挂载的是一个链表,那么就遍历链表,从里面找到自己想要的那个<key,value>数据。

格外补充:这个地方,在JDK1.8之后引入了红黑树的概念,首先我们看一下为啥要引入红黑树,如果没有引入红黑树,当数组挂载的链表达到一定长度之后,查询是非常耗时的,性能比较差,时间复杂度为:O(n)「读作:偶en」。

JDK1.8的优化就是,当链表的长度发到了一定长度后(8)会自动转换为红黑树,遍历一棵红黑树查找一个元素的时间复杂度为:O(logn)「读作:偶,老个en」,性能相对链表要高一些。

简单总结一下:

  1. 出现hash冲突的原因?两个不同的key计算出相同的数组存放位置;

  2. 初期是怎么解决的?在出现数组冲突的位置挂一个链表,实现存放多个数据。

  3. JDK1.8的优化?当数组长度达到一定值后自动转换为红黑树,降低时间复杂度。

4、HashMap是如何扩容的?

HashMap底层是一个数组,当数组满了之后,他会自动进行2倍扩容,用于盛放更多的数据。

比如,本来数组默认长度=16,扩容后*2=32。

扩容后还有一步操作:rehash,重新对每个hash值进行寻址,也就是用每个hash值跟新的数组长度 n-1 进行『&』与运算操作。

补充:扩容之后的与运算可能会导致之前的发生hash冲突的元素不再发生冲突。

博客地址:https://www.cnblogs.com/niceyoo

Acho que você gosta

Origin www.cnblogs.com/niceyoo/p/12508024.html
Recomendado
Clasificación