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?
List
sequência, repetívelSet
exclusivoQueue
Implementar filasMap
Armazenado 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
,LinkedList
quase todos os cenários que precisam ser usados podem serArrayList
substituídos, e o desempenho costuma ser melhor! MesmoLinkedList
Josh Bloch, o autor de , diz que nunca o usaLinkedList
.
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
comparable
A interface é, na verdade, dojava.lang
pacote que possui umcompareTo(Object obj)
método para classificarcomparator
A interface é, na verdade, do pacote java.util, que possui umcompare(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,
LinkedHashSet
a estrutura de dados subjacente é uma lista vinculada e uma tabela de hash,TreeSet
a 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,LinkedHashSet
usado em cenários que garantem que a ordem de inserção e extração de elementos atenda FIFO , eTreeSet
usado 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
HashMap
Pode 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 Map a interface |
implementar Set a interface |
Armazenar pares chave-valor | armazenar apenas objetos |
Chamada put() para adicionar elementos ao mapa |
Chame add() o método para Set adicionar elemento a |
HashMap Computação com chaveshashcode |
HashSet Use objetos membros para calcular hashcode o 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?
HashSet
O add()
método simplesmente chama o HashMap
mé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
ConcurrentHashMap
A 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:
ConcurrentHashMap
o segmento está bloqueadoHashtable
apenas um cadeado
ConcurrentHashMap
A diferença entre eHashtable
é 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.8HashMap1.8
é a mesma de , array + lista encadeada/árvore binária rubro-negra.Hashtable
Semelhante à estrutura de dados subjacente antes do JDK1.8 ,HashMap
ele 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,
ConcurrentHashMap
toda 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
ConcurrentHashMap
foi abandonadoSegment
, masNode
realizado diretamente pela estrutura de dados de array + lista encadeada + árvore rubro-negra, e usos de controle de simultaneidadesynchronized
e CAS para operar. (Os bloqueios foram muito otimizados após o JDK1.6synchronized
) O conjunto parece otimizado e thread-safeHashMap
, embora a estrutura de dados ainda possa ser vista no JDK1.8Segment
, mas os atributos foram simplificados, apenas para serem compatíveis com a versão antiga ;Hashtable
(mesmo bloqueio) : Usarsynchronized
para 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.