Qual é a diferença entre HashMap
, LinkedHashMap
e TreeMap
em Java? Não vejo diferença na saída, pois todos os três têm keySet
e values
. O que são Hashtable
s?
Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());
Hashtable
eHashMap
é que em um Hashtable, "nem a chave nem o valor podem ser nulos". Essa restrição não existe neste último.Eu prefiro a apresentação visual:
fonte
Todos os três representam o mapeamento de chaves exclusivas para valores e, portanto, implementam a interface Map .
HashMap é um mapa baseado no hash das teclas. Ele suporta operações O / 1 get / put. As chaves devem ter implementações consistentes
hashCode()
eequals()
para que isso funcione.O LinkedHashMap é muito semelhante ao HashMap, mas adiciona reconhecimento à ordem na qual os itens são adicionados (ou acessados), portanto, a ordem de iteração é igual à ordem de inserção (ou ordem de acesso, dependendo dos parâmetros de construção).
TreeMap é um mapeamento baseado em árvore. Suas operações put / get levam tempo O (log n). Requer que os itens tenham algum mecanismo de comparação, seja com Comparável ou Comparador. A ordem da iteração é determinada por esse mecanismo.
fonte
LinkedHashMap
iterará na ordem de inserção, não na ordem natural. Portanto, se você adicionar(2,5,3)
um aLinkedHashMap
e fizer um para cada um deles, ele retornará2,5,3
. Se fosse2,5,3
para um,TreeMap
ele retornará2,3,5
.Veja onde cada classe está na hierarquia de classes no diagrama a seguir ( maior ). TreeMap implementa
SortedMap
eNavigableMap
enquantoHashMap
não.HashTable
é obsoleto e aConcurrentHashMap
classe correspondente deve ser usada.fonte
HashMap
HashTable
LinkedHashMap
TreeMap
fonte
Apenas mais algumas informações da minha própria experiência com mapas, sobre quando eu usaria cada um:
removeEldestEntry()
método. Isso permite criar um objeto de cache que pode expirar dados usando alguns critérios que você define.fonte
Todas as três classes
HashMap
,TreeMap
eLinkedHashMap
implementajava.util.Map
a interface, e representa o mapeamento de chave única de valores.HashMap
A
HashMap
contém valores com base na chave.Ele contém apenas elementos exclusivos.
Pode ter uma chave nula e vários valores nulos.
Não mantém nenhuma ordem .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
LinkedHashMap
LinkedHashMap
contém valores com base na chave.É o mesmo que o HashMap, em vez disso, mantém a ordem de inserção . // Veja a desaceleração da classe abaixo
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
TreeMap
TreeMap
contém valores com base na chave. Ele implementa a interface NavigableMap e estende a classe AbstractMap.É o mesmo que
HashMap
manter a ordem crescente (ordenada usando a ordem natural de sua chave).public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
Hashtable
É uma classe herdada.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
Ref: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html
fonte
Veja como o desempenho varia.
Mapa em árvore que é uma implementação do mapa Ordenado. A complexidade da operação put, get e containsKey é O (log n) devido à ordem Natural
fonte
@Mit:
SortedMap
é uma interface, enquanto queTreeMap
é uma classe que implementa aSortedMap
interface. Isso significa que se segue o protocolo queSortedMap
solicita aos implementadores. Uma árvore, a menos que seja implementada como árvore de pesquisa, não pode fornecer dados ordenados porque a árvore pode ser qualquer tipo de árvore. Portanto, para fazer o TreeMap funcionar como a ordem classificada, ele implementa o SortedMap (por exemplo, Árvore de pesquisa binária - BST, BST balanceada como AVL e RB Tree, e até Árvore de pesquisa ternária - usada principalmente para pesquisas iterativas de maneira ordenada).Em NUT-SHELL
HashMap
: fornece dados em O (1), sem pedidosTreeMap
: fornece dados em O (log N), base 2. com chaves ordenadasLinkedHashMap
: é a tabela Hash com capacidade de lista vinculada (pense em SkipList indexado) para armazenar dados da maneira que são inseridos na árvore. Mais adequado para implementar a LRU (usada menos recentemente).fonte
A seguir, estão as principais diferenças entre o HashMap e o TreeMap
O HashMap não mantém nenhum pedido. Em outras palavras, o HashMap não fornece nenhuma garantia de que o elemento inserido primeiro será impresso primeiro, onde, assim como o TreeSet, os elementos do TreeMap também são classificados de acordo com a ordem natural de seus elementos.
A implementação interna do HashMap usa Hashing e o TreeMap internamente usa a implementação da árvore Vermelho-Preto.
O HashMap pode armazenar uma chave nula e muitos valores nulos.TreeMap não pode conter chaves nulas, mas pode conter muitos valores nulos.
O HashMap possui desempenho em tempo constante para operações básicas como get e put, ou seja, O (1). De acordo com os documentos do Oracle, o TreeMap fornece um custo garantido de log (n) para o método get e put.
O HashMap é muito mais rápido que o TreeMap, pois o tempo de desempenho do HashMap é constante em relação ao tempo de log do TreeMap na maioria das operações.
O HashMap usa o método equals () em comparação, enquanto o TreeMap usa o método compareTo () para manter a ordem.
O HashMap implementa a interface Map, enquanto o TreeMap implementa a interface NavigableMap.
fonte
Estas são implementações diferentes da mesma interface. Cada implementação tem algumas vantagens e algumas desvantagens (inserção rápida, pesquisa lenta) ou vice-versa.
Para obter detalhes, consulte o javadoc do TreeMap , HashMap , LinkedHashMap .
fonte
O mapa de hash não preserva o pedido de inserção.
Exemplo. Hashmap Se você estiver inserindo chaves como
Pode armazená-lo como
O Hashmap vinculado preserva o pedido de inserção.
Exemplo.
Se você estiver inserindo chaves
Ele irá armazená-lo como
mesmo que inserimos.
O mapa em árvore armazena os valores em Ordem crescente de chaves. Exemplo.
Se você estiver inserindo chaves
Ele irá armazená-lo como
fonte
HashMap:
LinkedHashMap:
TreeMap:
fonte
Todos oferecem um mapa de chave-> valor e uma maneira de iterar pelas chaves. A distinção mais importante entre essas classes são as garantias de tempo e a ordem das chaves.
Imagine que você passou um TreeMap, HashMap e LinkedHashMap vazios para a seguinte função:
A saída de cada um será semelhante aos resultados abaixo.
Para o HashMap, a saída foi, em meus próprios testes, {0, 1, -1}, mas pode ser qualquer ordem. Não há garantia no pedido.
Treemap, a saída foi {-1, 0, 1}
LinkedList, a saída foi {1, -1, 0}
fonte
Embora haja muitas respostas excelentes aqui, gostaria de apresentar minha própria tabela descrevendo as várias
Map
implementações incluídas no Java 11.Podemos ver essas diferenças listadas no gráfico da tabela:
HashMap
é o usoMap
geral usado quando você não tem necessidades especiais.LinkedHashMap
estendeHashMap
, adicionando este comportamento: Mantém um pedido, o pedido em que as entradas foram originalmente adicionadas . Alterar o valor da entrada do valor-chave não altera seu lugar no pedido.TreeMap
também mantém uma ordem, mas usa (a) a ordem "natural" , significando o valor docompareTo
método nos objetos-chave definidos naComparable
interface ou (b) chama umaComparator
implementação você fornece.TreeMap
implementa aSortedMap
interface e seu sucessor, aNavigableMap
interface.TreeMap
se não permitir que um NULL como a chave , enquantoHashMap
&LinkedHashMap
fazer.HashTable
é legado , do Java 1 . Suplantado pelaConcurrentHashMap
classe. A citação do Javadoc:ConcurrentHashMap
obedece à mesma especificação funcional queHashtable
e inclui versões dos métodos correspondentes a cada método deHashtable
.fonte
HashMap
pode conter uma chave nula.
O HashMap não mantém pedidos.
TreeMap
O TreeMap não pode conter nenhuma chave nula.
O TreeMap mantém a ordem crescente.
LinkedHashMap
O LinkedHashMap pode ser usado para manter a ordem de inserção, na qual as chaves são inseridas no Map ou também para manter uma ordem de acesso, na qual as chaves são acessadas.
Exemplos ::
1) mapa HashMap = novo HashMap ();
2) Mapa do TreeMap = novo TreeMap ();
3) mapa LinkedHashMap = novo LinkedHashMap ();
fonte
O mais importante entre todos os três é como eles salvam a ordem das entradas.
HashMap
- Não salva a ordem das entradas. por exemplo.LinkedHashMap
: Salva a ordem na qual as entradas foram feitas. por exemplo:TreeMap
: Salva as entradas em ordem crescente das teclas. por exemplo:fonte