Hashtable X HashMap

Ola amigos, alguém saberia me dizer qual é a diferença entre
Hashtable e HashMap ?

Já leu o javadoc delas?
Uma é thread-safe (syncronized) e a outra não. Veja qual é qual.

Até!

The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.

Existe uma lenda que um é mais rápido que o outro…

Obrigado pela sugestão! Peguei essa resposta lá.

:slight_smile:

Além disso, elas usam estratégias ligeiramente diferentes para posicionar os dados na hash table - elas armazenam os dados em seqüência diferente.

Testei com 4 versões do JDK (1.3, 1.4., 5.0, 6.0). Vejam os resultados:

import java.util.*;

// Compilado com: javac -source 1.3 -target -1.3 TesteClassesHash.java
class TesteClassesHash {
     public static void main(String[] args) {
          Map ht = new Hashtable();
          Map hs = new HashMap();
          String[] chaves = {"um", "dois", "tres", "quatro", "cinco", "seis", "sete", "oito", "nove", "dez"};
          String[] valores= {"eins", "zwei", "drei", "vier", "fuenf", "sechs", "sieben", "acht", "neun", "zehn"};
          for (int i = 0; i &lt chaves.length; ++i) {
              ht.put (chaves[i], valores[i]);
              hs.put (chaves[i], valores[i]);
          }
          System.out.println ("Hashtable: " + ht);
          System.out.println ("HashMap: " + hs);
    }
}
C&gtd:\jdk1.3.1_19\bin\java -cp . TesteClassesHash
Hashtable: {sete=sieben, dez=zehn, tres=drei, seis=sechs, dois=zwei, um=eins, ci
nco=fuenf, oito=acht, quatro=vier, nove=neun}
HashMap: {sete=sieben, dez=zehn, tres=drei, seis=sechs, dois=zwei, um=eins, cinc
o=fuenf, oito=acht, quatro=vier, nove=neun}

C&gtc:\j2sdk1.4.2_08\bin\java -cp . TesteClassesHash
Hashtable: {sete=sieben, dez=zehn, tres=drei, seis=sechs, dois=zwei, um=eins, ci
nco=fuenf, oito=acht, quatro=vier, nove=neun}
HashMap: {quatro=vier, dez=zehn, dois=zwei, oito=acht, nove=neun, seis=sechs, tr
es=drei, cinco=fuenf, sete=sieben, um=eins}

C&gtd:\jdk1.5.0_10\bin\java -cp . TesteClassesHash
Hashtable: {sete=sieben, dez=zehn, tres=drei, seis=sechs, dois=zwei, um=eins, ci
nco=fuenf, oito=acht, quatro=vier, nove=neun}
HashMap: {quatro=vier, dez=zehn, dois=zwei, oito=acht, nove=neun, seis=sechs, tr
es=drei, cinco=fuenf, sete=sieben, um=eins}

C&gtd:\jdk1.6.0\bin\java -cp . TesteClassesHash
Hashtable: {sete=sieben, dez=zehn, tres=drei, seis=sechs, dois=zwei, um=eins, ci
nco=fuenf, oito=acht, quatro=vier, nove=neun}
HashMap: {oito=acht, seis=sechs, quatro=vier, tres=drei, dois=zwei, dez=zehn, ci
nco=fuenf, sete=sieben, um=eins, nove=neun}

Ou seja: no Java 1.3, HashMap e HashTable estão funcionando parecido (pelo menos para poucos dados). Nas outras versões elas funcionam diferentemente.

HashMap:

  1. Não é syncronized;
  2. Não garante que a ordem do mapa vai permanecer constante com o tempo;
  3. Aceita null tanto no valor quanto na chave;
  4. Vem na Collections Framework (desde java 1.2);

HashTable:

  1. É syncronized;
  2. Não aceita null;
  3. Vem na Collections Framework (desde java 1.0);

Fonte:
Javadoc
Pesquisa Google

A HashTable é sincronizada. O HashMap, não. Mas você pode gerar uma versão sincronizada do mapa fazendo:

Map seuMapaSincronizado = Collections.synchronizedMap(seuMapa);

Nesse caso, permite que você aplique sincronização apenas onde é necessário e não em todo e qualquer uso do mapa.

Por não ser sincronizado, o HashMap é ligeiramente mais rápido do que o HashTable. Mas eu recomendo a utilização do HashMap não só por isso, mas também por ele implementar mais diretamente a Collections framework.

A HashTable é uma classe que existe antes dessa framework e, portanto, por questões de compatibilidade, terá métodos que não são comuns em outros mapas, tais como putElement() - que faz rigorosamente o mesmo que o put.

Sobre a questão de performance, vale a pena ler o artigo do Brian Goetz sobre esse assunto:
http://www-128.ibm.com/developerworks/java/library/j-jtp04223.html

[quote=Rage]Ola amigos, alguém saberia me dizer qual é a diferença entre
Hashtable e HashMap ?
[/quote]

As diferenças são:

  1. Hashtable está disponível em todos os ambientes java , inclusive j2me
    mas apenas em jse Hashtable faz parte da Java Collections Framework ao implementar Map.
  2. Hashtable é um mapa sincronizado. Ou seja, não pode simultaneamente fazer put e get. Para obter uma classe que faz o mesmo no jse use Collections.synchronizedMap().
  3. A velocidade é a mesma, em ambiente mono-thread. Como é dificil ter um ambiente mono-thread, use HashMap e Collections.synchronizedMap() em ocasiões em que precisa explicitamente de sincronismo.

Como regra geral faça o seu código depender de Map e nunca de Hashtable ou HashMap, vai que no futuro vc decide que um LinkedHashMap é que bom … Exemplo:

   public Map obtemdadis() {}  // ok

   public HashMap obtemdadis() {}  // errado

   public Hashtable obtemdadis() {}  // errado

nota : jee inclui jse

vlw, ajudaram bastante. obrigado!

:mrgreen: