Quais são as diferenças entre a HashMap
e a Hashtable
em Java?
Qual é mais eficiente para aplicativos não encadeados?
java
collections
hashmap
hashtable
dmanxiii
fonte
fonte
ConcurrentMap
é necessário aqui, pois a pergunta diz "aplicativos não encadeados", o que significa que a segmentação / simultaneidade não é um problema.Respostas:
Existem várias diferenças entre
HashMap
eHashtable
em Java:Hashtable
está sincronizado , enquantoHashMap
não está. IssoHashMap
melhora para aplicativos não encadeados, pois os objetos não sincronizados geralmente têm melhor desempenho do que os sincronizados.Hashtable
não permitenull
chaves ou valores.HashMap
permite umanull
chave e qualquer número denull
valores.Uma das subclasses do HashMap é que
LinkedHashMap
, caso você deseje uma ordem de iteração previsível (que é a ordem de inserção por padrão), você pode facilmente trocar aHashMap
por aLinkedHashMap
. Isso não seria tão fácil se você estivesse usandoHashtable
.Como a sincronização não é um problema para você, eu recomendo
HashMap
. Se a sincronização se tornar um problema, você também pode olharConcurrentHashMap
.fonte
Collections.synchronizedMap()
.Hashtable
("sincronizar todos os métodos deve cuidar de qualquer problema de simultaneidade!") Torna muito pior para aplicativos de threads. É melhor sincronizar externamente umHashMap
(e pensar nas consequências) ou usar umaConcurrentMap
implementação (e explorar sua API estendida para simultaneidade). Conclusão: o único motivo para usarHashtable
é quando uma API herdada (de cerca de 1996) exige.Observe que muitas respostas afirmam que o Hashtable está sincronizado. Na prática, você compra muito pouco. A sincronização está nos métodos de acessador / mutador interromperá a adição ou remoção de dois encadeamentos do mapa simultaneamente, mas no mundo real, muitas vezes você precisará de sincronização adicional.
Um idioma muito comum é "verificar e colocar" - ou seja, procure uma entrada no
Map
e adicione-a se ela ainda não existir. Isso não é de forma alguma uma operação atômica, se você usaHashtable
ouHashMap
.Uma sincronização equivalente
HashMap
pode ser obtida por:Mas, para implementar corretamente essa lógica, você precisa de sincronização adicional do formulário:
Mesmo a iteração sobre
Hashtable
as entradas de uma (ou umaHashMap
obtida porCollections.synchronizedMap
) não é segura para threads, a menos que você também proteja oMap
sejam modificadas por meio de sincronização adicional.As implementações da
ConcurrentMap
interface (por exemploConcurrentHashMap
) resolvem parte disso, incluindo a semântica de verificação e ação segura do thread , como:fonte
Hashtable
é considerado código legado. Não há nada sobreHashtable
isso que não possa ser feito usandoHashMap
ou derivações deHashMap
, portanto, para o novo código, não vejo justificativa para voltarHashtable
.fonte
Essa pergunta é frequentemente feita em entrevista para verificar se o candidato entende o uso correto das classes de coleta e está ciente das soluções alternativas disponíveis.
HashMap
classe é aproximadamente equivalente aHashtable
, exceto que não é sincronizada e permite nulos. (HashMap
permite valores nulos como chave e valor, enquantoHashtable
não permitenull
s).HashMap
não garante que a ordem do mapa permaneça constante ao longo do tempo.HashMap
não está sincronizado enquantoHashtable
está sincronizado.HashMap
é à prova de falhas, enquanto o enumerador doHashtable
não é e lançaConcurrentModificationException
se qualquer outro Thread modificar o mapa estruturalmente, adicionando ou removendo qualquer elemento, excetoIterator
o próprioremove()
método. Mas esse não é um comportamento garantido e será feito pela JVM com o melhor esforço.Nota sobre alguns termos importantes:
Hashtable
terá que adquirir um bloqueio no objeto, enquanto outros aguardarão a liberação do bloqueio.set
método, pois ele não modifica a coleção "estruturalmente". No entanto, se antes da chamadaset
, a coleção foi modificada estruturalmente,IllegalArgumentException
será lançada.HashMap
pode ser sincronizado porMap m = Collections.synchronizeMap(hashMap);
O mapa fornece visualizações de coleção em vez de suporte direto à iteração via objetos de enumeração. As visualizações de coleção aprimoram bastante a expressividade da interface, conforme discutido mais adiante nesta seção. O mapa permite iterar sobre chaves, valores ou pares de valores-chave;
Hashtable
não fornece a terceira opção. O mapa fornece uma maneira segura de remover entradas no meio da iteração;Hashtable
nao fiz. Por fim, o Map corrige uma pequena deficiência naHashtable
interface.Hashtable
possui um método chamado contains, que retorna true se oHashtable
contém um determinado valor. Dado o nome, você esperaria que esse método retornasse true seHashtable
contivesse uma chave determinada, porque a chave é o mecanismo de acesso primário para aHashtable
. A interface do mapa elimina essa fonte de confusão renomeando o métodocontainsValue
. Além disso, isso melhora a consistência da interface -containsValue
paraleloscontainsKey
.fonte
set
operação em aHashMap
. 3) Aput(...)
operação não será lançadaIllegalArgumentException
se houver uma alteração anterior. 4) O comportamento de falha rápida deHashMap
também ocorre se você alterar um mapeamento. 5) O comportamento à prova de falhas é garantido. (O que não é garantido é o comportamento de umHashTable
se você fizer uma modificação concorrente o comportamento real é ... imprevisível..)Hashtable
também não garante que a ordem dos elementos do mapa seja estável ao longo do tempo. (Você está talvez confundindoHashtable
comLinkedHashMap
.)thing.set(thing.get() + 1);
que, na maioria das vezes, pega novatos de surpresa como completamente desprotegidos, especialmente se os métodosget()
eset()
forem sincronizados. Muitos deles estão esperando mágica.HashMap
: Uma implementação daMap
interface que usa códigos de hash para indexar uma matriz.Hashtable
: Oi, 1998 chamado. Eles querem a API de suas coleções de volta.Sério, é melhor ficar longe de
Hashtable
tudo. Para aplicativos de thread único, você não precisa da sobrecarga extra de sincronização. Para aplicativos altamente simultâneos, a sincronização paranóica pode levar a fome, conflitos ou pausas desnecessárias na coleta de lixo. Como Tim Howland apontou, você pode usarConcurrentHashMap
.fonte
Lembre-se de que
HashTable
era uma classe herdada antes da introdução do Java Collections Framework (JCF) e posteriormente foi adaptado para implementar aMap
interface. O mesmo foiVector
eStack
.Portanto, sempre fique longe deles no novo código, pois sempre há uma alternativa melhor no JCF, como outros já haviam apontado.
Aqui está a folha de dicas da coleção Java que você achará útil. Observe que o bloco cinza contém a classe herdada HashTable, Vector e Stack.
fonte
Já existem muitas boas respostas. Estou adicionando alguns pontos novos e resumindo.
HashMap
eHashtable
ambos são usados para armazenar dados na forma de chave e valor . Ambos estão usando a técnica de hash para armazenar chaves exclusivas. Mas há muitas diferenças entre as classes HashMap e Hashtable que são fornecidas abaixo.HashMap
HashMap
não está sincronizado. Não é seguro para threads e não pode ser compartilhado entre muitos threads sem o código de sincronização adequado.HashMap
permite uma chave nula e vários valores nulos.HashMap
é uma nova classe introduzida no JDK 1.2.HashMap
é rápido.HashMap
como sincronizado chamando este códigoMap m = Collections.synchronizedMap(HashMap);
HashMap
é atravessado pelo Iterator.HashMap
é à prova de falhas.HashMap
herda a classe AbstractMap.Hashtable
Hashtable
está sincronizado. É seguro para threads e pode ser compartilhado com muitos threads.Hashtable
não permite nenhuma chave ou valor nulo.Hashtable
é uma classe herdada.Hashtable
é lento.Hashtable
é sincronizado internamente e não pode ser dessincronizado.Hashtable
é percorrido pelo Enumerator e Iterator.Hashtable
não é rápido.Hashtable
herda a classe Dictionary.Leitura adicional Qual é a diferença entre o HashMap e o Hashtable em Java?
fonte
Além do que izb disse,
HashMap
permite valores nulos, enquantoHashtable
que não.Observe também que
Hashtable
estende aDictionary
classe, que como o estado Javadocs , é obsoleta e foi substituída pelaMap
interface.fonte
Dê uma olhada neste gráfico. Ele fornece comparações entre diferentes estruturas de dados, juntamente com
HashMap
eHashtable
. A comparação é precisa, clara e fácil de entender.Matriz de coleção Java
fonte
Hashtable
é semelhante aoHashMap
e possui uma interface semelhante. É recomendável usarHashMap
, a menos que você precise de suporte para aplicativos herdados ou precise de sincronização, pois osHashtables
métodos são sincronizados. Portanto, no seu caso, como você não é multi-threading,HashMaps
é sua melhor aposta.fonte
Outra diferença importante entre hashtable e hashmap é que o Iterator no HashMap é à prova de falhas, enquanto o enumerador do Hashtable não é e lança ConcurrentModificationException se qualquer outro Thread modificar o mapa estruturalmente, adicionando ou removendo qualquer elemento, exceto o método remove () do próprio Iterator. Mas esse não é um comportamento garantido e será feito pela JVM com o melhor esforço. "
Minha fonte: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html
fonte
Além de todos os outros aspectos importantes já mencionados aqui, a API Collections (por exemplo, interface Map) está sendo modificada o tempo todo para estar em conformidade com as "últimas e melhores" adições às especificações Java.
Por exemplo, compare a iteração do Java 5 Map:
versus a antiga abordagem Hashtable:
No Java 1.8, também nos é prometido ser capaz de construir e acessar o HashMaps, como nas boas e antigas linguagens de script:
Atualização: Não, eles não chegarão em 1,8 ... :(
Os aprimoramentos da coleção do Project Coin serão no JDK8?
fonte
Hashtable
está sincronizado, enquantoHashMap
não está. Isso tornaHashtable
mais lento queHashmap
.Para aplicativos não encadeados, use,
HashMap
pois eles são os mesmos em termos de funcionalidade.fonte
O HashTable é sincronizado. Se você o estiver usando em um único encadeamento, poderá usar o HashMap , que é uma versão não sincronizada. Objetos não sincronizados costumam ter um pouco mais de desempenho. A propósito, se vários threads acessam um HashMap simultaneamente e pelo menos um deles modifica o mapa estruturalmente, ele deve ser sincronizado externamente. Youn pode agrupar um mapa não sincronizado em um mapa sincronizado usando:
O HashTable pode conter apenas objetos não nulos como chave ou valor. O HashMap pode conter uma chave nula e valores nulos.
Os iteradores retornados pelo Map são rápidos, se o mapa for estruturalmente modificado a qualquer momento após a criação do iterador, de qualquer forma, exceto pelo método de remoção do próprio iterador, o iterador lançará a
ConcurrentModificationException
. Portanto, diante da modificação simultânea, o iterador falha de maneira rápida e limpa, em vez de arriscar um comportamento arbitrário e não determinístico em um tempo indeterminado no futuro. Enquanto as enumerações retornadas pelos métodos de chaves e elementos do Hashtable não são à prova de falhas.HashTable e HashMap são membros do Java Collections Framework (desde a plataforma Java 2 v1.2, o HashTable foi adaptado para implementar a interface Map).
HashTable é considerado código legado, a documentação aconselha o uso do ConcurrentHashMap no lugar do Hashtable se uma implementação altamente simultânea segura por thread é desejada.
O HashMap não garante a ordem na qual os elementos são retornados. Para o HashTable, acho que é o mesmo, mas não tenho certeza, não encontro recursos que indiquem isso claramente.
fonte
HashMap
eHashtable
têm diferenças algorítmicas significativas também. Ninguém mencionou isso antes e é por isso que estou trazendo isso à tona.HashMap
construirá uma tabela de hash com potência de dois tamanhos, aumentará dinamicamente para que você tenha no máximo cerca de oito elementos (colisões) em qualquer bucket e agitará os elementos muito bem para tipos de elementos gerais. No entanto, oHashtable
implementação fornece um controle melhor e mais refinado sobre o hash, se você souber o que está fazendo, ou seja, você pode corrigir o tamanho da tabela usando, por exemplo, o número primo mais próximo ao tamanho do domínio de valores e isso resultará em melhor desempenho do que o HashMap, ou seja, menos colisões para alguns casos.Separado das diferenças óbvias discutidas extensivamente nesta questão, vejo o Hashtable como um carro de "acionamento manual", onde você tem melhor controle sobre o hash e o HashMap como o equivalente de "acionamento automático" que geralmente apresenta bom desempenho.
fonte
Com base nas informações aqui , eu recomendaria usar o HashMap. Eu acho que a maior vantagem é que o Java impedirá que você o modifique enquanto estiver iterando, a menos que você faça isso através do iterador.
fonte
A
Collection
- às vezes chamado de contêiner - é simplesmente um objeto que agrupa vários elementos em uma única unidade.Collection
s são usados para armazenar, recuperar, manipular e comunicar dados agregados. Uma estrutura de coleções W é uma arquitetura unificada para representar e manipular coleções.O
HashMap
JDK1.2
e HashtableJDK1.0
, ambos são usados para representar um grupo de objetos que são representados em<Key, Value>
par. Cada<Key, Value>
par é chamado deEntry
objeto. A coleção de entradas é referida pelo objeto deHashMap
eHashtable
. As chaves em uma coleção devem ser únicas ou distintas. [como eles são usados para recuperar um valor mapeado de uma chave específica. os valores em uma coleção podem ser duplicados.]« Membro da Superclasse, Legado e Estrutura de Coleta
Hashtable é uma classe herdada introduzida em
JDK1.0
, que é uma subclasse da classe Dictionary. DoJDK1.2
Hashtable é reprojetado para implementar a interface do Mapa para tornar um membro da estrutura de coleta. O HashMap é um membro do Java Collection Framework desde o início de sua introdução noJDK1.2
. HashMap é a subclasse da classe AbstractMap.« Capacidade inicial e fator de carga
A capacidade é o número de buckets na tabela de hash e a capacidade inicial é simplesmente a capacidade no momento em que a tabela de hash é criada. Observe que a tabela de hash está aberta: no caso de "
hash
collision
", um único bloco armazena várias entradas, que devem ser pesquisadas sequencialmente. O fator de carga é uma medida de quão cheia é permitida a tabela de hash antes que sua capacidade seja aumentada automaticamente.O HashMap constrói uma tabela de hash vazia com a capacidade inicial padrão (16) e o fator de carga padrão (0,75). Onde como Hashtable constrói hashtable vazio com uma capacidade inicial padrão (11) e fator de carga / razão de preenchimento (0,75).
« Modificação estrutural em caso de colisão de hash
HashMap
,Hashtable
no caso de colisões de hash, eles armazenam as entradas do mapa em listas vinculadas. Do Java8 paraHashMap
se o hash bucket crescer além de um determinado limite, esse bucket mudará delinked list of entries to a balanced tree
. que melhoram o desempenho do pior caso de O (n) para O (log n). Ao converter a lista em árvore binária, o hashcode é usado como uma variável ramificada. Se houver dois códigos de hash diferentes no mesmo bucket, um é considerado maior e vai para a direita da árvore e outro para a esquerda. Mas quando os doisHashMap
códigos de hash são iguais, assume que as chaves são comparáveis e compara a chave para determinar a direção, para que alguma ordem possa ser mantida. É uma boa prática tornar as chavesHashMap
comparáveis . Ao adicionar entradas se o tamanho do balde atingirTREEIFY_THRESHOLD = 8
converta a lista vinculada de entradas em uma árvore balanceada, ao remover entradas menoresTREEIFY_THRESHOLD
e no máximoUNTREEIFY_THRESHOLD = 6
reconverterá a árvore balanceada na lista vinculada de entradas. Java 8 SRC , stackpost« Iteração de exibição de coleção, Fail-Fast e Fail-Safe
Iterator
é uma natureza à prova de falhas. ou seja, lança ConcurrentModificationException se uma coleção é modificada enquanto itera diferente de seu próprio método remove (). Enquanto queEnumeration
é à prova de falhas na natureza. Não lança nenhuma exceção se uma coleção for modificada durante a iteração.De acordo com a Java API Docs, o Iterator é sempre preferido sobre a Enumeração.
NOTA: A funcionalidade da interface de enumeração é duplicada pela interface do iterador. Além disso, o Iterator adiciona uma operação de remoção opcional e possui nomes de métodos mais curtos. Novas implementações devem considerar o uso do Iterator em vez da Enumeração.
Em Java 5, introduziu a Interface ConcurrentMap :
ConcurrentHashMap
- umaConcurrentMap
implementação altamente simultânea e de alto desempenho, apoiada por uma tabela de hash. Essa implementação nunca bloqueia ao executar recuperações e permite que o cliente selecione o nível de simultaneidade para atualizações. Ele foi concebido como um substituto paraHashtable
: além da implementaçãoConcurrentMap
, ele suporta todos os métodos "herdados" peculiaresHashtable
.HashMapEntry
O valor de cada s é volátil , garantindo, assim, consistência de granulação fina para modificações contidas e leituras subsequentes; cada leitura reflete a atualização concluída mais recentementeIteradores e enumerações são à prova de falhas - refletindo o estado em algum momento desde a criação do iterador / enumeração; isso permite leituras e modificações simultâneas ao custo de consistência reduzida. Eles não lançam ConcurrentModificationException. No entanto, os iteradores são projetados para serem usados por apenas um encadeamento por vez.
De maneira semelhante,
Hashtable
mas diferenteHashMap
, essa classe não permite que nulo seja usado como chave ou valor.« Chaves nulas e valores nulos
HashMap
permite no máximo uma chave nula e qualquer número de valores nulos. Onde asHashtable
não permite nem mesmo uma única chave nula e um valor nulo, se a chave ou o valor nulo for, ele lançará NullPointerException. Exemplo« Sincronizado, Thread Safe
Hashtable
é sincronizado internamente. Portanto, é muito seguro usarHashtable
em aplicativos multithread. Onde comoHashMap
não é sincronizado internamente. Portanto, não é seguro usarHashMap
em aplicativos multithread sem sincronização externa. Você pode sincronizar externamenteHashMap
usando oCollections.synchronizedMap()
método« Desempenho
Como
Hashtable
é sincronizado internamente, isso tornaHashtable
um pouco mais lento que oHashMap
.@Vejo
HashMap
no Java 8fonte
Para aplicativos encadeados, muitas vezes você pode se safar do ConcurrentHashMap - depende dos seus requisitos de desempenho.
fonte
1.
Hashmap
eHashTable
chave e valor da loja.2.
Hashmap
pode armazenar uma chave comonull
.Hashtable
não pode armazenarnull
.3.
HashMap
não está sincronizado, masHashtable
está sincronizado.4.
HashMap
pode ser sincronizado comCollection.SyncronizedMap(map)
fonte
Além das diferenças já mencionadas, deve-se notar que, desde o Java 8,
HashMap
substitui dinamicamente os Nós (lista vinculada) usados em cada bucket por TreeNodes (árvore vermelho-preta), de modo que, mesmo se houver colisão de hash alta, o pior caso é quando a pesquisa éO (log (n)) para
HashMap
Vs O (n) emHashtable
.* A melhoria acima mencionada não tenha sido aplicado a
Hashtable
ainda, mas apenas paraHashMap
,LinkedHashMap
eConcurrentHashMap
.FYI, atualmente,
TREEIFY_THRESHOLD = 8
: se um bucket contiver mais de 8 nós, a lista vinculada será transformada em uma árvore balanceada.UNTREEIFY_THRESHOLD = 6
: quando um depósito fica muito pequeno (devido à remoção ou redimensionamento), a árvore é convertida novamente na lista vinculada.fonte
Existem 5 diferenciações básicas com HashTable e HashMaps.
fonte
Minha pequena contribuição:
fonte
HashMap: é uma classe disponível no pacote java.util e é usada para armazenar o elemento no formato de chave e valor.
Hashtable: é uma classe herdada que está sendo reconhecida dentro da estrutura da coleção.
fonte
HashTable é uma classe herdada no jdk que não deve mais ser usada. Substitua os usos dele por ConcurrentHashMap . Se você não precisa de segurança do segmento, o uso HashMap que não é threadsafe , mas mais rápido e usa menos memória.
fonte
Hashtable
está sincronizado enquantoHashMap
não está.HashMap
é à prova de falhas, enquanto o enumerador doHashtable
não é. Se você alterar o mapa durante a iteração, você saberá.HashMap
permite valores nulos, enquantoHashtable
não.fonte
HashMap e HashTable
1) Hashtable e Hashmap implementam a interface java.util.Map 2) Hashmap e Hashtable são uma coleção baseada em hash. e trabalhando em hash. portanto, essas são semelhanças entre HashMap e HashTable.
1) A primeira diferença é que o HashMap não é seguro para threads enquanto o HashTable é ThreadSafe
2) O HashMap é melhor em termos de desempenho porque não é seguro para threads. enquanto o desempenho do Hashtable não é melhor porque é seguro para threads. portanto, vários segmentos não podem acessar o Hashtable ao mesmo tempo.
fonte
Hashtable:
Hashtable é uma estrutura de dados que retém valores do par de valores-chave. Não permite nulo para as chaves e os valores. Você receberá um
NullPointerException
se adicionar valor nulo. Está sincronizado. Por isso, vem com seu custo. Somente um thread pode acessar o HashTable em um determinado momento.Exemplo :
HashMap:
O HashMap é como o Hashtable, mas também aceita o par de valores-chave. Permite nulo para as chaves e os valores. Seu desempenho é melhor do que
HashTable
, porque éunsynchronized
.Exemplo:
fonte
HashMap
é emulado e, portanto, utilizável,GWT client code
enquanto queHashtable
não é.fonte
Tópico antigo e clássico, basta adicionar este blog útil que explica isso:
http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/
Blog de Manish Chhabra
fonte
HashMap e Hashtable são usados para armazenar dados na forma de chave e valor. Ambos estão usando a técnica de hash para armazenar chaves exclusivas. No entanto, existem muitas diferenças entre as classes HashMap e Hashtable fornecidas abaixo.
fonte