Diferença entre HashMap e Hashtable

A estrutura Java Collections fornece um conjunto de classes de coleção. Cada classe tem seus próprios pontos fortes e fracos de desempenho. Algumas das classes fornecem implementações completas que podem ser usadas como estão. Outros são abstratos que fornecem implementações esqueléticas que são usadas como pontos de partida para criar coleções. As implementações de coleção usam a estrutura do wrapper sincronizado para fornecer classes sincronizadas, caso contrário, as implementações não são sincronizadas. Várias classes fornecem implementações da interface do mapa.

A plataforma Java contém três implementações de Mapa de uso geral: HashMap, TreeMap e LinkedHashMap. HashMap e Hashtable são duas coleções em Java usadas para armazenar pares de chave / valor em uma tabela de hash. Hashtable é um mapa sincronizado e HashMap é um mapa não sincronizado. No entanto, se você precisar usar um mapa sincronizado, um Hashtable é mais rápido do que usar um HashMap em um wrapper sincronizado. Ambos são coleções baseadas em hash em Java, mas eles têm seu quinhão de diferenças. Destacamos algumas diferenças importantes entre os dois para ajudar você a entender melhor os termos.

O que é o HashMap?

O HashMap é uma implementação de mapa baseada em uma tabela de hash que fornece desempenho em tempo constante para inserir e localizar pares. A classe HashMap fornece uma implementação de mapa baseada em uma estrutura de dados Hashtable. Essa implementação suporta todas as operações de mapa e permite vários valores nulos, mas apenas uma chave nula. Ele usa pares de chave / valor para armazenar valores em uma tabela de hash. É um mapa não sincronizado, o que significa que não é seguro para threads e não pode ser compartilhado entre vários threads sem a sincronização adequada..

O que é Hashtable?

Ao contrário do HashMap, o Hashtable é um mapa sincronizado e é seguro para threads, o que significa que pode ser compartilhado entre vários threads. No Hashtable, você especifica um objeto que pode ser usado como uma chave e o valor que acompanha a chave. Um Hashtable mapeia chaves para valores com a ajuda de uma função hash. Java fornece essa função na forma do método hashcode () do Object, que as classes substituem para fornecer códigos de hash apropriados. Diferentemente do HashMap, o Hashtable não suporta valores nulos e chaves nulas porque há verificação nula na implementação do método put do Hashtable.

Diferença entre HashMap e Hashtable

  1. Noções básicas do HashMap vs. Hashtable

Ambas são coleções baseadas em hash em Java usadas para armazenar dados em pares chave / valor. O HashMap é uma implementação de mapa baseada em uma tabela de hash que fornece desempenho em tempo constante para inserir e localizar pares. O desempenho pode ser ajustado com o uso de construtores que permitem definir a capacidade e o fator de carga da tabela de hash. O Hashtable básico é bastante semelhante ao HashMap, mesmo com os nomes dos métodos. Ele armazena o par de chave / valor na tabela de hash. No Hashtable, você especifica um objeto que pode ser usado como uma chave e o valor que acompanha a chave.

  1. Sincronização de HashMap vs. Hashtable

O HashMap e o Hashtable usam técnicas de hash para armazenar valores com base na chave. Como o HashMap, o Hashtable usa pares de chave / valor para armazenar valores em uma tabela de hash. No entanto, a principal diferença entre os dois é a sincronização. HashMap é um mapa não sincronizado, enquanto Hashtable é um mapa sincronizado. Isso significa que o HashMap não é seguro para threads e não pode ser compartilhado entre vários threads sem o código de sincronização adequado. Pelo contrário, o Hashtable é seguro para threads e pode ser compartilhado entre vários threads. O Hashtable é mais rápido do que usar um HashMap em um wrapper sincronizado, se você precisar usar um Mapa sincronizado.

  1. Chaves e valores nulos para o HashMap vs. Hashtable

A classe HashMap fornece uma implementação de mapa baseada em uma estrutura de dados Hashtable. Essa implementação suporta todas as operações de Mapa e permite vários valores nulos, mas apenas uma chave nula, para que ele possa manter propriedades exclusivas da chave. No entanto, não garante a ordem em que as entradas são armazenadas. O Hashtable, por outro lado, mapeia chaves para valores com a ajuda de uma função hash. Diferentemente do HashMap, o Hashtable não suporta valores nulos e chaves nulas porque há verificação nula na implementação do método put do Hashtable.

  1. Desempenho do HashMap vs. Hashtable

Como o HashMap não é um mapa sincronizado, é muito mais rápido e melhor que um Hashtable em termos de desempenho e, de fato, usa menos memória que o Hashtable. Embora eles sejam praticamente idênticos, o Hashtable é um pouco mais lento que um HashMap, mas mais rápido que um HashMap sincronizado. Inerentemente, não é seguro usar o Hashtable com acesso multithread porque apenas os métodos são sincronizados. Hashtable é a contrapartida sincronizada do HashMap. Objetos não sincronizados têm melhor desempenho quando comparados a objetos sincronizados, assim como um Hashtable tem melhor desempenho em um único ambiente de encadeamento.

HashMap vs. Hashtable: Gráfico de comparação

 

Resumo do HashMap vs. Hashtable

A classe HashMap fornece um mapa não classificado e não ordenado. Portanto, quando você precisa de um mapa e não se importa com a ordem em que as entradas são armazenadas, o HashMap é o caminho a seguir.

O Hashtable, assim como Vector, tem sido desde os tempos pré-históricos de Java. Assim como o Vector é uma contrapartida sincronizada do ArrayList mais moderno e avançado, o Hashtable é a contrapartida sincronizada do HashMap. No entanto, uma classe não pode ser sincronizada; portanto, quando dizemos que o Hashtable é um mapa sincronizado, isso significa que os principais métodos da classe são sincronizados.. 

Embora ambos sejam praticamente idênticos, a diferença está na maneira como são sincronizados e no desempenho. O HashMap tem melhor desempenho em um ambiente multiencadeado, enquanto o Hashtable tem melhor desempenho em um único ambiente encadeado.