Eu sei que LinkedHashMap
tem uma ordem de iteração previsível (ordem de inserção). O Set
devolvido LinkedHashMap.keySet()
e o Collection
devolvido LinkedHashMap.values()
também mantêm esse pedido?
Eu sei que LinkedHashMap
tem uma ordem de iteração previsível (ordem de inserção). O Set
devolvido LinkedHashMap.keySet()
e o Collection
devolvido LinkedHashMap.values()
também mantêm esse pedido?
Respostas:
A interface Mapa fornece três visualizações de coleção , que permitem que o conteúdo de um mapa seja exibido como um conjunto de chaves, coleção de valores ou conjunto de mapeamentos de valores-chave. A ordem de um mapa é definida como a ordem na qual os iteradores nas visualizações de coleção do mapa retornam seus elementos. Algumas implementações de mapas, como a
TreeMap
classe, oferecem garantias específicas quanto à sua ordem; outros, como aHashMap
turma, não.
- Mapa
Essa lista vinculada define a ordem da iteração, que normalmente é a ordem na qual as chaves foram inseridas no mapa ( ordem de inserção ).
Então, sim, keySet()
, values()
, e entrySet()
(os três pontos de vista de recolha referido) valores de retorno na ordem dos usos da lista ligadas internos. E sim, o JavaDoc Map
e o LinkedHashMap
garante.
Esse é o objetivo desta aula, afinal.
Collection
é apenas a classe base para quais valores () retornam. A implementação da coleção retornada ainda é controlada pelo LinkedHashMap
. No LinkedHashMap
caso, está retornando uma LinkedValues
instância, uma classe privada dentro do LinkedHashMap.java.
Map
) que vincula explicitamente a ordem de um mapa aos iteradores nas visualizações de coleção do mapa (e esclarece quais são essas visualizações de coleção). Essa foi a peça que faltava para mim.
Olhando para a fonte, parece que sim. keySet()
, values()
E entrySet()
todos usam a mesma entrada iterador internamente.
Não se confunda com LinkedHashMap.keySet()
e LinkedHashMap.entrySet()
retorna conjunto e, portanto, não deve garantir ordenação!
Set
é uma interface com HashSet
, TreeSet
etc, suas implementações. A HashSet
implementação da Set
interface não garante pedidos. Mas TreeSet
faz. Também LinkedHashSet
faz.
Portanto, depende de como Set
foi implementado LinkedHashMap
para saber se a referência de retorno do conjunto garantirá o pedido ou não. Eu passei pelo código fonte do LinkedHashMap
, fica assim:
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
Assim, o LinkedHashMap / HashMap tem sua própria implementação de Set
ie KeySet
. Portanto, não confunda isso com HashSet
.
Além disso, a ordem é mantida pela forma como os elementos são inseridos no balde. Observe o addEntry(..)
método de LinkedHashMap
e compare-o com o HashMap
que destaca a principal diferença entre HashMap
e LinkedHashMap
.
Você pode assumir isso. O Javadoc diz 'ordem de iteração previsível' e os únicos iteradores disponíveis em um mapa são aqueles para keySet (), entrySet () e valores ().
Portanto, na ausência de qualquer qualificação adicional, claramente se aplica a todos esses iteradores.
Como o AFAIK não está documentado, você não pode assumi-lo "formalmente". É improvável, no entanto, que a implementação atual mude.
Se você deseja garantir a ordem, pode iterar sobre o mapa que entra e inseri-los em um conjunto classificado com uma função de ordem de sua escolha, embora você esteja pagando um custo de desempenho, naturalmente.
Olhando para a interface, ele retorna um simples Set
e não um SortedSet
. Portanto, não há garantias.
Antes de assumir uma garantia implícita, observando a implementação (sempre uma má ideia), observe também as implementações em todas as outras implementações Java :)
É melhor criar, por exemplo, um TreeSet com o keySet no construtor.
Eu não acho que você possa presumir a ordem de keySet () e values ().
Posso escrever facilmente uma implementação do LinkedHashMap que retorna keySet () e values () desordenados, desde que cumpra o contrato desses dois métodos definidos no Map e substituídos no HashMap.
LinkedHashMap
classe é manter a ordem dos elementos enquanto itera o mapa e esse comportamento é bem especificado. Se você escrever uma subclasse sem cumprir a especificação da classe base, estará fazendo algo muito errado.
values()
, além dissokeySet()
, ampliei a questão para incluir isso. Isso significa que mais perguntas podem ser encerradas como duplicatas.