Resumo das perguntas da entrevista da fonte do mapa

Resumo das perguntas da entrevista da fonte do mapa

O mapa ocupa uma grande parte das perguntas da entrevista na entrevista, das quais HashMap é a principal delas. Algumas dessas perguntas da entrevista podem ser explicadas com clareza e outras são difíceis de explicar.

Um: mapear problemas gerais de estrutura de dados

1.1: Fale sobre a estrutura de dados subjacente do HashMap

Resposta: A camada inferior do HashMap é a estrutura de dados de matriz + lista vinculada + árvore vermelha e preta. A principal função da matriz é facilitar a pesquisa rápida. A complexidade de tempo é O (1), o tamanho padrão é 16 e o ​​índice de subscrito da matriz é calculado pelo hashcode da chave. O elemento da matriz é chamado de Nó. Quando os hashcodes de várias chaves são iguais, mas os valores das chaves são diferentes, um único Nó será convertido em uma lista vinculada. A complexidade da consulta da lista vinculada é O (n). Quando o comprimento da lista vinculada é maior ou igual a 8 e a matriz Quando o tamanho de é maior que 64, a lista vinculada será transformada em uma árvore vermelho-preto. A complexidade da consulta da árvore vermelho-preto é O (log (n)). Simplificando, o pior número de consultas é equivalente à profundidade máxima da árvore vermelho-preto.

1.2: Quais são as semelhanças e diferenças entre HashMap, TreeMap e LinkedHashMap?

Resposta: O mesmo ponto:

  1. Todos os três usarão árvores vermelho-pretas sob certas circunstâncias;
  2. Durante a iteração, se a estrutura de dados do Mapa for alterada, ConcurrentModificationException será relatado;

diferença:

  1. A estrutura de dados do ashMap é principalmente uma matriz, e a consulta é muito rápida. A estrutura de dados do TreeMap é principalmente uma árvore vermelho-preto. Aproveita as características da árvore vermelho-preto que é pequena à esquerda e grande à direita para realizar a classificação de chaves. LinkedHashMap adiciona uma lista vinculada com base no HashMap. A estrutura realiza duas estratégias de acesso à sequência de inserção e menos exclusão de acesso;
  2. Devido às diferenças na estrutura de dados subjacente dos três mapas, os cenários de uso dos três são diferentes. TreeMap é adequado para cenários que precisam ser classificados por chave, LinkedHashMap é adequado para acesso na ordem de inserção ou cenários que precisam excluir os elementos menos acessados. Usamos os cenários restantes. HashMap é o suficiente, a maioria dos cenários em nosso trabalho basicamente usa HashMap;
  3. Devido à diferença na estrutura de dados subjacente dos três mapas, a API da embalagem superior é ligeiramente diferente;
  4. HashMap é o mesmo que o algoritmo de hash subjacente de LinkedHashMap, TreeMap não tem algoritmo de hash;

Dois: detalhes do código-fonte HashMap

2.1: Como o HashMap se expande?

Resposta: Quando expandir:

  1. Quando colocado, o array está vazio e a expansão inicial é realizada.O tamanho padrão da expansão é 16;
  2. Após a colocação ser bem-sucedida, quando for descoberto que o tamanho do array existente é maior do que o limite de expansão, a expansão é executada e a expansão é duas vezes o tamanho do array antigo;

O limite para expansão é o limite. O limite será recalculado a cada expansão. O limite é igual ao tamanho da matriz * fator de impacto (0,75).

2.2: O que fazer quando o hash entra em conflito?

Resposta: O conflito de hash se refere à situação em que o cálculo do código de hash do valor da chave é o mesmo, mas o valor da chave é diferente.

Se houver apenas um elemento no intervalo ou se já for uma lista vinculada, o novo elemento será anexado diretamente ao final da lista vinculada;

Se os elementos no intervalo já forem listas vinculadas e o número de listas vinculadas for maior ou igual a 8, há duas situações neste momento:

  1. Se o tamanho da matriz for menor que 64 neste momento, e a matriz for expandida novamente, a lista vinculada não será convertida em uma árvore vermelho-preto;
  2. Se o tamanho da matriz for maior que 64, a lista vinculada será convertida em uma árvore vermelho-preto;

Aqui, não apenas o número de listas vinculadas é considerado maior ou igual a 8, mas também o tamanho da matriz é avaliado. A capacidade da matriz é menor que 64. Não há conversão imediata. A estimativa é que a árvore vermelho e preto ocupa muito mais espaço do que a lista vinculada e a conversão também é demorada, então a matriz Quando a capacidade é pequena, o conflito é sério. Podemos tentar expandir a capacidade primeiro para ver se podemos resolver o problema do conflito expandindo a capacidade.

2.2: Por que a lista vinculada deve ser transformada em uma árvore vermelho-preto quando o número de listas vinculadas é maior ou igual a 8?

Resposta: Quando há muitas listas vinculadas, a travessia pode ser demorada. A conversão para uma árvore vermelha e preta pode reduzir a complexidade do tempo da travessia, mas a conversão para uma árvore vermelha e preta requer espaço e custos de conversão demorados. De acordo com o cálculo da fórmula de distribuição solta, em circunstâncias normais, o conceito de 8 no número de listas vinculadas é inferior a um em dez milhões, portanto, em condições normais, as listas vinculadas não serão convertidas em árvores vermelhas e pretas. O objetivo deste projeto é evitar anormalidades. Em certas circunstâncias, por exemplo, quando há um problema com o algoritmo de hash e o número de listas vinculadas é facilmente maior ou igual a 8, ele ainda pode ser percorrido rapidamente.

Pergunta estendida: Quando a árvore vermelha e preta se tornará uma lista vinculada?

Resposta: Quando o número de nós é menor ou igual a 6, a árvore vermelho-preto será automaticamente convertida em uma lista vinculada. A principal consideração é o custo de espaço da árvore vermelho-preto. Quando o número de nós é menor ou igual a 6, percorrer a lista vinculada também é rápido, então vermelho-preto A árvore se tornará uma lista vinculada novamente.

2.2: Quando o HashMap é colocado, e se a chave já existe na matriz e eu não quero sobrescrever o valor? O que devo fazer se quiser retornar ao valor padrão quando o valor obtido estiver vazio?

Resposta: Se a matriz tiver uma chave, mas você não quiser sobrescrever o valor, pode escolher o método putIfAbsent. Este método tem uma variável incorporada onlyIfAbsent. Se a incorporada for verdadeira, ela não substituirá. O método put que geralmente usamos, o onlyIfAbsent interno é falso, o que permite a substituição do.

Ao pegar o valor, se ele estiver vazio e você quiser retornar ao valor padrão, você pode usar o método getOrDefault. O primeiro parâmetro do método é chave e o segundo parâmetro é o valor padrão que você deseja retornar, como map.getOrDefault ("2", "0") , Quando não houver um valor de chave 2 no mapa, ele retornará 0 por padrão em vez de vazio.

Três: Outras perguntas da entrevista do mapa

3.1: Quando o DTO é usado como a chave do Mapa, há algum ponto que precisa de atenção?

Resposta: DTO é um portador de dados, que pode ser considerado uma classe Java com muitos atributos, podemos realizar operações get e set nesses atributos.

Veja que tipo de Map, se for um HashMap, você deve substituir os métodos equals e hashCode, porque quando get e put, você precisa usar o método equals para determinar a igualdade; se for um TreeMap, o DTO precisa implementar a interface Comparable, porque TreeMap usará a interface Comparable para determinar o tamanho da chave; se for LinkedHashMap, é o mesmo que HashMap.

3.2: Qual é o significado de LRU em LinkedHashMap e como ele é implementado?

Resposta: LRU, nome completo em inglês: Menos usado recentemente, chinês chamado Least Recent Used, no LinkedHashMap, também é chamado de Least Access Delete Strategy. Podemos definir uma determinada estratégia através do método removeEldestEntry para tornar o elemento menos visitado no momento certo O princípio é que ao final da execução do método put, LinkedHashMap verificará essa estratégia e, se atender à estratégia, excluirá o nó principal.

O princípio de garantir que o nó principal seja o elemento menos visitado é: quando o LinkedHashMap for obtido, ele moverá o nó atualmente visitado para o final da lista vinculada.Lentamente, o nó principal será o elemento menos visitado.

3.3: Por que é recomendado que todos os elementos do TreeMap implementem a interface Comparable? Mas quando a chave é String, não temos nenhum trabalho extra?

Resposta: Como a camada inferior do TreeMap é para comparar o tamanho de duas chaves por classificação, é recomendado que as chaves implementem a interface Comparable para desenvolver a ordem de classificação desejada, e a própria String implementou a interface Comparable, portanto, ao usar String, Não precisamos de trabalho extra, não apenas String, outros tipos de embalagem também implementam a interface Comparable, como Long, Double, Short, etc.

Quatro: Resumo

As perguntas da entrevista de Map são principalmente HashMap, e farão muitas perguntas de código-fonte. TreeMap e LinkedHashMap focam principalmente em funções e cenários, como itens de bônus.
Existem muitos tipos de perguntas para a entrevista no mapa, mas contanto que você entenda os princípios, não importa quantas perguntas você mude, a resposta será mais fácil.

Acho que você gosta

Origin blog.csdn.net/weixin_38478780/article/details/107927282
Recomendado
Clasificación