Nesta pergunta Como posso selecionar com eficiência um contêiner da Biblioteca Padrão no C ++ 11? é um fluxograma útil para usar na escolha de coleções C ++.
Eu pensei que este era um recurso útil para pessoas que não têm certeza de qual coleção eles deveriam usar, então tentei encontrar um fluxograma semelhante para Java e não consegui fazê-lo.
Quais recursos e "folhas de dicas" estão disponíveis para ajudar as pessoas a escolher a coleção certa a ser usada ao programar em Java? Como as pessoas sabem quais implementações de Lista, Conjunto e Mapa devem usar?
Respostas:
Como não consegui encontrar um fluxograma semelhante, decidi fazer um eu mesmo.
Este fluxograma não trata de coisas como acesso sincronizado, segurança de encadeamentos etc. ou coleções herdadas, mas abrange os 3 conjuntos padrão s, os 3 mapas padrão e as 2 listas padrão .
Esta imagem foi criada para esta resposta e está licenciada sob uma Licença Internacional Creative Commons Attribution 4.0. A atribuição mais simples é vincular-se a esta pergunta ou a esta resposta.
Outros recursos
Provavelmente, a outra referência mais útil é a página a seguir na documentação da Oracle que descreve cada coleção .
HashSet vs TreeSet
Há uma discussão detalhada de quando usar
HashSet
ouTreeSet
aqui: Hashset vs TreesetArrayList vs LinkedList
Discussão detalhada: Quando usar o LinkedList sobre o ArrayList?
fonte
LinkedList
vs.ArrayList
Primeiro, se a lista é de tamanho significativo,LinkedList
é preferível.LinkedList
possui sobrecarga por elemento; portanto, é assintoticamente pior em termos de consumo de memória que umArrayList
. Além disso, se a maior parte do acesso estiver no final da lista,ArrayList
é preferível, pois fornece acesso a elementos aleatórios em tempo constante. Acessar on
th elemento de aLinkedList
é umaO(n)
operação. ... De fato, a decisão de usar uma lista vinculada deve sempre ser "não".LinkedList
é uma lista dupla, portanto, o acesso no início e no final é rápido. Você observará que os ramos acima das três perguntas precisam responder sim antes de eu recomendar o usoLinkedList
- portanto, em outras palavras, concordo com você que, na maioria dos casos, a resposta é não. Coisas como filas e desenfileiramentos nas quais você está constantemente adicionando e removendo itens das extremidades da área da lista é um bom caso de usoLinkedList
.LinkedList
usa mais memória por elemento ...ArrayList
nunca libera memória. Isso significa que, se você tiver uma lista que às vezes cresce para um tamanho enorme, mas geralmente é pequena, oArrayList
desempenho da memória será pior. A sobrecarga de memória emList
si é geralmente (embora nem sempre) pequena em comparação com a dos elementos que ela contém.Map<K,V>
não faz parte dejava.util.collection
Resumo das principais coleções não simultâneas e não sincronizadas
Collection
: Uma interface que representa uma "bolsa" não ordenada de itens, chamada "elementos". O elemento "próximo" é indefinido (aleatório).Set
: Uma interface representando aCollection
sem duplicatas.HashSet
: ASet
apoiado por aHashtable
. Uso de memória mais rápido e menor, quando o pedido não é importante.LinkedHashSet
: AHashSet
com a adição de uma lista vinculada para associar elementos na ordem de inserção . O elemento "next" é o próximo elemento inserido mais recentemente.TreeSet
: ASet
onde os elementos são ordenados por umComparator
(normalmente ordem natural ). Uso de memória maior e mais lento, mas necessário para pedidos baseados em comparador.EnumSet
: Um personalizado extremamente rápido e eficienteSet
para um único tipo de enum.List
: Uma interface representando aCollection
cujos elementos são ordenados e cada um tem um índice numérico representando sua posição, em que zero é o primeiro elemento e(length - 1)
é o último.ArrayList
:List
Suportado por uma matriz, em que a matriz possui um comprimento (chamado "capacidade") que é pelo menos tão grande quanto o número de elementos (o "tamanho" da lista). Quando o tamanho excede a capacidade (quando o(capacity + 1)-th
elemento é adicionado), a matriz é recriada com uma nova capacidade de(new length * 1.5)
- essa recreação é rápida, pois é usadaSystem.arrayCopy()
. Excluir e inserir / adicionar elementos requer que todos os elementos vizinhos (à direita) sejam deslocados para dentro ou fora desse espaço. O acesso a qualquer elemento é rápido, pois requer apenas o cálculo(element-zero-address + desired-index * element-size)
para encontrar sua localização. Na maioria das situações , umArrayList
é preferível a umLinkedList
.LinkedList
: UmList
respaldado por um conjunto de objetos, cada um vinculado a seus vizinhos "anterior" e "próximo". ALinkedList
também é umQueue
eDeque
. O acesso aos elementos é feito iniciando no primeiro ou no último elemento e passando até o índice desejado. Inserção e exclusão, uma vez que o índice desejado seja alcançado via travessia, é uma questão trivial de re-mapear apenas os links de vizinhos imediatos para apontar para o novo elemento ou ignorar o elemento agora excluído.Map
: Uma interface que representa umCollection
local em que cada elemento possui uma "chave" de identificação - cada elemento é um par de valores-chave.HashMap
: AMap
onde as chaves são desordenadas e apoiadas por aHashtable
.LinkedhashMap
: As chaves são ordenadas por ordem de inserção .TreeMap
: AMap
onde as chaves são ordenadas por umComparator
(normalmente ordem natural).Queue
: Uma interface que representa umCollection
onde os elementos são, geralmente, adicionados a uma extremidade e removidos da outra (FIFO: primeiro a entrar, primeiro a sair).Stack
: Uma interface que representa um localCollection
onde os elementos são, geralmente, adicionados (enviados) e removidos (exibidos) da mesma extremidade (LIFO: último a entrar, primeiro a sair).Deque
: Abreviação de "fila dupla", geralmente pronunciada "deck". Uma lista vinculada que normalmente é adicionada e lida apenas em cada extremidade (não no meio).Diagramas básicos de coleta:
Comparando a inserção de um elemento com um
ArrayList
eLinkedList
:fonte
Imagem ainda mais simples está aqui. Intencionalmente simplificado!
Coleção é qualquer coisa que contém dados chamados "elementos" (do mesmo tipo). Nada mais específico é assumido.
List é umacoleção indexada de dados em que cada elemento tem um índice. Algo como a matriz, mas mais flexível.
Os dados da lista mantêm a ordem de inserção.
Operação típica: obtenha o n-ésimo elemento.
Conjunto é um conjunto de elementos , cada elemento apenas uma vez (os elementos são diferenciados usando sua
equals()
métodoOs dados no conjunto são armazenados principalmente apenas para saber quais dados existem.
Operação típica: diga se um elemento está presente na lista.
O mapa é algo como a Lista, mas, em vez de acessar os elementos pelo índice inteiro, você os acessa pela chave , que é qualquer objeto. Como a matriz em PHP :)
Os dados no mapa são pesquisáveis por sua chave.
Operação típica: obtenha um elemento por seu ID (onde ID é de qualquer tipo, não apenas
int
como no caso de Lista).As diferenças
Definir e mapear: em Definir, você pesquisa os dados por si mesmos , enquanto no mapa, por sua chave .
Lista e Mapa: na Lista, você acessa o elemento pelo
int
índice (posição na Lista), enquanto no Mapa pela chave que os de qualquer tipo (normalmente: ID)Listar e definir: na lista, os elementos são vinculados à sua posição e podem ser duplicados, enquanto que em os elementos são apenas "presentes" (não presentes) e são únicos (no significado de
equals()
oucompareTo()
paraSortedSet
)fonte
É simples: se você precisar armazenar valores com as chaves mapeadas para eles, vá para a interface Map, caso contrário, use List para valores que podem ser duplicados e, finalmente, use a interface Set se não desejar valores duplicados em sua coleção.
Aqui está a explicação completa http://javatutorial.net/choose-the-right-java-collection , incluindo fluxograma etc.
fonte
Mapa
Ao escolher a
Map
, fiz esta tabela resumindo os recursos de cada uma das dez implementações incluídas no Java 11.fonte
Coleções comuns, Coleções comuns
fonte
Qual Java Collection devo usar?
Depende de qual problema você está tentando resolver ou de quais requisitos você possui.
Exemplos :
fonte