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?
java
iteration
linkedhashmap
user256239
fonte
fonte
values()
, além dissokeySet()
, ampliei a questão para incluir isso. Isso significa que mais perguntas podem ser encerradas como duplicatas.Respostas:
- Mapa
- LinkedHashMap
Então, sim,
keySet()
,values()
, eentrySet()
(os três pontos de vista de recolha referido) valores de retorno na ordem dos usos da lista ligadas internos. E sim, o JavaDocMap
e oLinkedHashMap
garante.Esse é o objetivo desta aula, afinal.
fonte
Collection
é apenas a classe base para quais valores () retornam. A implementação da coleção retornada ainda é controlada peloLinkedHashMap
. NoLinkedHashMap
caso, está retornando umaLinkedValues
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()
EentrySet()
todos usam a mesma entrada iterador internamente.fonte
Não se confunda com
LinkedHashMap.keySet()
eLinkedHashMap.entrySet()
retorna conjunto e, portanto, não deve garantir ordenação!Set
é uma interface comHashSet
,TreeSet
etc, suas implementações. AHashSet
implementação daSet
interface não garante pedidos. MasTreeSet
faz. TambémLinkedHashSet
faz.Portanto, depende de como
Set
foi implementadoLinkedHashMap
para saber se a referência de retorno do conjunto garantirá o pedido ou não. Eu passei pelo código fonte doLinkedHashMap
, fica assim:Assim, o LinkedHashMap / HashMap tem sua própria implementação de
Set
ieKeySet
. Portanto, não confunda isso comHashSet
.Além disso, a ordem é mantida pela forma como os elementos são inseridos no balde. Observe o
addEntry(..)
método deLinkedHashMap
e compare-o com oHashMap
que destaca a principal diferença entreHashMap
eLinkedHashMap
.fonte
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.
fonte
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.
fonte
Olhando para a interface, ele retorna um simples
Set
e não umSortedSet
. 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.
fonte
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.
fonte
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.