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á.
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 < 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>d:\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>c:\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>d:\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>d:\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:
- Não é syncronized;
- Não garante que a ordem do mapa vai permanecer constante com o tempo;
- Aceita null tanto no valor quanto na chave;
- Vem na Collections Framework (desde java 1.2);
HashTable:
- É syncronized;
- Não aceita null;
- 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:
- 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. - 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().
- 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: