Diferenças entre HashMap e Hashtable

Diferenças entre HashMap e Hashtable

1. Visão geral

Neste breve tutorial, vamos nos concentrar nas principais diferenças entreHashtableeHashMap.

2. Hashtable eHashMap em Java

HashtableeHashMap são bastante semelhantes - ambos são coleções que implementam a interfaceMap.

Além disso, os métodosput(),get(),remove() econtainsKey() fornecem desempenho de tempo constante O (1). Internamente, esses métodos funcionam com base no conceito geral de hash usando buckets para armazenamento de dados.

Nenhuma classe mantém a ordem de inserção dos elementos. Em outras palavras, o primeiro item adicionado pode não ser o primeiro item quando iteramos sobre os valores.

Mas eles também têm algumas diferenças que tornam um melhor que outro em algumas situações. Vamos examinar mais de perto essas diferenças.

3. Diferenças entreHashtable eHashMap

3.1. Sincronização

Em primeiro lugar,Hashtable is thread-safee podem ser compartilhados entre vários threads no aplicativo.

Por outro lado,HashMap não está sincronizado e não pode ser acessado por vários threads sem código de sincronização adicional. Podemos usarCollections.synchronizedMap() para fazer uma versão thread-safe de umHashMap. Também podemos apenas criar um código de bloqueio personalizado ou tornar o código seguro para threads usando a palavra-chavesynchronized.

HashMap não está sincronizado, portanto, é mais rápido e usa menos memória do queHashtable. Geralmente, objetos não sincronizados são mais rápidos que objetos sincronizados em um único aplicativo encadeado.

3.2. Valores nulos

Outra diferença énull handling. HashMap permite adicionar umEntry comnull como chave, bem como muitas entradas comnull como valor. Em contraste,Hashtable doesn’t allow null at all. Vejamos um exemplo denull eHashMap:

HashMap map = new HashMap();
map.put(null, "value");
map.put("key1", null);
map.put("key2", null);

Isso resultará em:

assertEquals(3, map.size());

A seguir, vamos ver como o Hashtable é diferente:

Hashtable table = new Hashtable();
table.put("key", null);

Isso resulta em umNullPointerException. Adicionar um objeto comnull como chave também resulta emNullPointerException:

table.put(null, "value");

3.3. Iteração sobre Elementos

HashMap usaIterator para iterar sobre os valores, enquantoHashtable temEnumerator para o mesmo. OIterator é um sucessor deEnumerator que elimina suas poucas desvantagens. Por exemplo,Iterator tem um métodoremove() para remover elementos de coleções subjacentes.

OIterator é umfail-fast iterator. Em outras palavras, ele lança umConcurrentModificationException quando a coleção subjacente é modificada durante a iteração. Vejamos o exemplo de fail-fast:

HashMap map = new HashMap();
map.put("key1", "value1");
map.put("key2", "value2");

Iterator iterator = map.keySet().iterator();
while(iterator.hasNext()){
    iterator.next();
    map.put("key4", "value4");
}

Isso lança uma exceçãoConcurrentModificationException porque estamos chamandoput() enquanto iteramos na coleção.

4. Quando escolherHashMap sobreHashtable

Devemos usarHashMap para um aplicativo não sincronizado ou de thread único.

É importante mencionar que desde o JDK 1.8,Hashtable se tornou obsoleto. No entanto,ConcurrentHashMap é uma ótima substituição deHashtable. Devemos considerarConcurrentHashMap para usar em aplicativos com vários threads.

5. Conclusão

Neste artigo, ilustramos as diferenças entreHashMapeHashtablee o que devemos ter em mente quando precisamos escolher um.

Como de costume, a implementação de todos esses exemplos e trechos de código sãoover on Github.