Entrevista da coleção Java

Coleção Java entrevista comum

Visão geral das coleções Java

Implemente principalmente duas interfaces

  • Coleção
  • Mapa

Fale-me sobre a diferença entre List, Set, Queue e Map?

  • Listsequência, repetível
  • Setexclusivo
  • QueueImplementar filas
  • MapArmazenado em pares chave-valor (chave-valor), pesquisável por chave

Diferença entre ArrayList e Vector?

  • É a principal classe de implementação de List, que não é thread-safe
  • É uma antiga classe de implementação de List, geralmente não usada, mas thread-safe

Qual é a diferença entre ArrayList e LinkedList?

  • Tópicos não são garantidos para serem seguros
  • A implementação da estrutura de dados subjacente é diferente: uma usa uma matriz e a outra usa uma lista duplamente encadeada
  • ArrayList insere mais elementos móveis e LinkedList é fácil de inserir (mas não é particularmente conveniente)
  • arrayList suporta acesso aleatório rápido enquanto o outro não
  • Ocupação do espaço de memória: LinkedList será maior porque os ponteiros são armazenados

Geralmente não usamos em projetos LinkedList, LinkedListquase todos os cenários que precisam ser usados ​​podem ser ArrayListsubstituídos, e o desempenho costuma ser melhor! Mesmo LinkedListJosh Bloch, o autor de , diz que nunca o usa LinkedList.

Vamos falar sobre o mecanismo de expansão do ArrayList

  • assegurarCapacityInternal() é chamado para garantir a capacidade antes de inserir elementos
  • Quando a capacidade for insuficiente, o método grow será chamado e a nova capacidade será 1,5 vezes a capacidade antiga
  • copiar dados antigos para novos

A diferença entre comparável e comparador

  • comparableA interface é, na verdade, do java.langpacote que possui um compareTo(Object obj)método para classificar
  • comparatorA interface é, na verdade, do pacote java.util, que possui um compare(Object obj1, Object obj2)método para classificar

Qual é o significado de desordem e não repetibilidade

  • Não ordenado significa que o armazenamento subjacente não tem ordem, mas a ordem é determinada de acordo com o valor de hash dos dados
  • A não repetibilidade refere-se ao julgamento igual ao adicionar elementos

Compare as semelhanças e diferenças entre HashSet, LinkedHashSet e TreeSet

  • Todas são classes de implementação de Set, não thread-safe
  • HashSet é baseado na tabela de hash, LinkedHashSeta estrutura de dados subjacente é uma lista vinculada e uma tabela de hash, TreeSeta estrutura de dados subjacente é uma árvore rubro-negra,
  • Os cenários de aplicação são diferentes, dependendo dos requisitos para a ordem. HashSetÉ usado em cenários que não precisam garantir a ordem de inserção e extração de elementos, LinkedHashSetusado em cenários que garantem que a ordem de inserção e extração de elementos atenda FIFO , e TreeSetusado em cenários que oferecem suporte a regras de classificação personalizadas para elementos .

A diferença entre Fila e Deque

  • QueueÉ uma fila de terminação única, que só pode inserir elementos de uma extremidade e excluir elementos da outra extremidade.A implementação geralmente segue a regra FIFO (first-in-first-out) .
  • DequeÉ uma fila de duas extremidades e os elementos podem ser inseridos ou excluídos em ambas as extremidades da fila.

A diferença entre HashMap e Hashtable

  • HashMap não é thread-safe, Hashtable é thread-safe (usando sincronizado para modificar o método interno)
  • Devido a problemas de segurança de encadeamento, o HashMap é mais eficiente
  • HashMapPode armazenar chave nula e valor
  • No HashMap, quando o comprimento da lista encadeada for maior que o limite (o padrão é 8), a lista encadeada é convertida em uma árvore rubro-negra (será julgada antes de converter a lista encadeada em uma árvore rubro-negra, se o comprimento atual da matriz é menor que 64, então ele escolherá expandir a matriz primeiro, em vez de converter em uma árvore rubro-negra), não existe tal mecanismo para HashTable

A diferença entre HashMap e HashSet

HashMap HashSet
implementa Mapa interface implementar Seta interface
Armazenar pares chave-valor armazenar apenas objetos
Chamada put()para adicionar elementos ao mapa Chame add()o método para Setadicionar elemento a
HashMapComputação com chaveshashcode HashSetUse objetos membros para calcular hashcodeo valor, que pode ser o mesmo para dois objetos hashcode, então equals()o método é usado para julgar a igualdade de objetos

Como o HashSet verifica duplicatas?

HashSetO add()método simplesmente chama o HashMapmétodo put()e julga o valor de retorno para garantir que não haja elementos duplicados.

A implementação subjacente do HashMap

A maneira de resolver conflitos de hash mudou

Antes do JDK1.8

Após JDK1.8

A diferença entre ConcurrentHashMap e Hashtable

ConcurrentHashMapA diferença entre e Hashtableé refletida principalmente nas diferentes formas de obter a segurança da rosca .

  • A estrutura de dados é diferente: uma é uma matriz mais uma árvore ou uma lista encadeada e a outra é um dado mais uma lista encadeada
  • As implementações de segurança de thread diferem:
    • ConcurrentHashMapo segmento está bloqueado
    • Hashtableapenas um cadeado

ConcurrentHashMapA diferença entre e Hashtableé refletida principalmente nas diferentes formas de obter a segurança da rosca.

  • Estrutura de dados inferior:ConcurrentHashMap A camada inferior do JDK1.7 é realizada por array segmentado + lista encadeada , e a estrutura de dados adotada pelo JDK1.8 HashMap1.8é a mesma de , array + lista encadeada/árvore binária rubro-negra. HashtableSemelhante à estrutura de dados subjacente antes do JDK1.8 , HashMapele adota a forma de array + lista vinculada . O array é o corpo principal do HashMap e a lista vinculada existe principalmente para resolver conflitos de hash;
  • O caminho para alcançar a segurança da rosca (importante):
    • Na época do JDK1.7, ConcurrentHashMaptoda a matriz de baldes era dividida em segmentos ( Segment, bloqueios segmentados), cada bloqueio bloqueava apenas parte dos dados no contêiner (consulte o diagrama abaixo) e acesso multiencadeado a dados em diferentes data segmentos no contêiner, não haverá competição de bloqueio e a taxa de acesso simultâneo será melhorada.
    • Na época do JDK1.8, o conceito de ConcurrentHashMapfoi abandonado Segment, mas Noderealizado diretamente pela estrutura de dados de array + lista encadeada + árvore rubro-negra, e usos de controle de simultaneidade synchronizede CAS para operar. (Os bloqueios foram muito otimizados após o JDK1.6 synchronized) O conjunto parece otimizado e thread-safe HashMap, embora a estrutura de dados ainda possa ser vista no JDK1.8 Segment, mas os atributos foram simplificados, apenas para serem compatíveis com a versão antiga ;
    • Hashtable(mesmo bloqueio) : Usar synchronizedpara garantir a segurança do encadeamento é muito ineficiente. Quando um thread acessa o método de sincronização, outros threads também acessam o método de sincronização e podem entrar em um estado de bloqueio ou votação, como usar put para adicionar elementos, outro thread não pode usar put para adicionar elementos, nem pode usar get, e o a competição se tornará cada vez mais acirrada e menos eficiente.

Acho que você gosta

Origin blog.csdn.net/weixin_51209821/article/details/129124329
Recomendado
Clasificación