HashMap vs HashTable

java-script

Em java, HashMap e Hashtable são duas estruturas de dados do framework Collection que compartilham algumas características  em comums.

  1. Implementam a a  interface Map
  2. Utilizam o conceito de key-value para armazenar dados.
  3. Fazem uso de Hashing para armazenar dados;

Apesar das características em comum, existem diferenças muito significativas, onde podemos destacar por exemplo que estruturas HashMap não são thread-safety enquanto que estruturas Hashtable são thread-safet.

Vamos as diferênças:

1) Thread Safe

Hashtable é internamente sincronizadas, por isso é muito mais seguro utilizá-la em aplicações multi-thread. HasMap não é internamente sincronizada, o que a torna menos segura em uma aplicação multi-thread. (HashMap permite que se use o métodoCollections.synchronizedMap() para contornar essa situação).

2) Mães diferentes

Embora ambas implementem a interface MAP, cada uma extende uma classes. HasMap extende uma classe chamada AbstractMap enquanto Hashtable extende uma classe chamada dictionary

3) Null Keys And Null Values

Com o HasMap podemos ter uma chave uma nula. Ele permite valores nulos para estas chaves também. Ja o Hashtable não permite nem chaves nem valores nulos.

O Código abaixo irá gerar erro ao ser executado.

public static void main(String args[]) {

    HashMap<String, String> hashMap = new HashMap<String, String>();
    hashMap.put(null, "default");
    hashMap.put("Key1", "valor da key 1");
    hashMap.put("Key2", null);


    Hashtable<String, String> hashtable = new Hashtable<String, String>();
    hashtable.put(null, "Default");  //Ira gerar NullPointerException
    hashtable.put("Key1", "VAlor da Key 1");
    hashtable.put("Key2", null); //Ira gerar NullPointerException

}

4) Navegação

Para navegar através dos elementos você precisa utilizar  iterators tanto no HasMap quanto no Hashtable ,  porém o Hashtable possui uma opção a mais de navegar sobre os elementos como um Enumeration.

HashMap<String, String> hashMap = new HashMap<String, String>();
    hashMap.put(null, "default");
    hashMap.put("Key1", "valor da key 1");
    hashMap.put("Key2", null);

    // "Navegando no HasMap"
    for (Map.Entry<String, String> pair : hashMap.entrySet()) {
        System.out.println("(HashMap) Key: " + pair.getKey() + " - Value:" + pair.getValue());
    }

    Hashtable<String, String> hashtable = new Hashtable<String, String>();
    hashtable.put("Key0", "Default");
    hashtable.put("Key1", "Valor da Key 1");
    hashtable.put("Key2", "Valor da Key 2");

    Set set = hashtable.keySet();
    // "Navegando o HasTable"
    Iterator itr = set.iterator();
    while (itr.hasNext()) {
        String key = itr.next();
        System.out.println("(Hashtable) Key:" + key + " - " + hashtable.get(key));
    }

    // "Navegando no hastable por elements"
    Enumeration enumeration = hashtable.elements();
    while (enumeration.hasMoreElements()) {
        System.out.println("(Hastable - enumeration)" + enumeration.nextElement());
    }

HashMap é fail-fast por isso ele lança ConcurrentModificationException se o HashMap for modificado após a criação de Iterator  (exceção da utilização do método remove).

O Hashtable é fail-safe porque enumerador para o Hashtable não lança ConcurrentModificationException se qualquer outra Thread modificar o Hashtable adicionando ou removendo qualquer elemento.  Porém este não é um comportamento garantido e será gerenciado pela JVM.

6) Performance

Como Hashtable é sincronizado internamente, isso o torna ligeiramente mais lento do que o HashMap.

7) Morrendo.

Apesar do Hashtable ser membro do Java Collection Framework desde antes do JDK 1.2 ele é um candidato ao status de deprecated. Atualmente ConcurrentHashMap é considerado como melhor opção ao Hashtable (desde o JDK 1.5).

9) O que usar ?

Se thread safety não é uma preocupação para você, recomento o HashMap, mas se for lembre-se do item anterior que diz que ConcurrentHashMap é uma recomendação. 

HashMap HashTable
Não é thread-safe. É thread safe.
Permite chaves nulas Não permite chaves nulas
Iterators são fail-fast. O Enumeration é fail-safe.
Filha de AbstractMap. Filha de Dictionary.
Usa somente iterators Alem do iterator possui um enumeration.
Mais rápido Mais lento

 

Similaridades entre Hashmap e Hastable :

1) Armazenam os dados na forma de chave-valor.

2) Usam a técnica de Hashing para o armazenamento de chave-valor.

3) Implementam interface de mapa.

4) Não mantêm qualquer ordem dos elementos.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s