1. Hashtable é uma subclasse de Dicionário.
Copie o código do código da seguinte forma:
classe pública Hashtable<K,V>
estende Dicionário<K,V>
implementa Map<K,V>, Cloneable, java.io.Serializable
HashMap:
Copie o código do código da seguinte forma:
classe pública HashMap<K,V>
estende AbstractMap<K,V>
implementa Map<K,V>, Cloneable, Serializable
HashMap e Hashtable são classes de implementação da interface Map;
2. Os métodos em Hashtable são síncronos (), mas os métodos em HashMap não são síncronos por padrão. Ou seja, em aplicativos multithread, Hashtable pode ser usado com segurança sem operações especiais; para HashMap, é necessário um mecanismo de sincronização adicional; Mas o problema de sincronização do HashMap pode ser resolvido através de um método estático de Coleções:
Copie o código do código da seguinte forma:
public static <K,V> Mapa<K,V> sincronizadoMap(Map<K,V> m)
Este método retorna um mapa sincronizado, o que significa que o mapa retornado é thread-safe. Deve-se observar que ao iterar no mapa retornado, você deve sincronizar manualmente no mapa retornado, caso contrário, isso levará a um comportamento indefinido:
Copie o código do código da seguinte forma:
Mapa m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // Não precisa estar no bloco sincronizado
...
sincronizado(m) { // Sincronizando em m, não em s!
Iterator i = s.iterator(); // Deve estar no bloco sincronizado
enquanto (i.hasNext())
foo(i.next());
}
3. No HashMap, null pode ser usado como chave, e existe apenas uma dessas chaves, podendo haver uma ou mais chaves cujo valor correspondente é nulo; Quando o método get() retorna um valor nulo, pode significar que a chave não existe no HashMap, ou também pode significar que o valor correspondente à chave é nulo. Portanto, no HashMap, o método get() não pode ser usado para determinar se uma determinada chave existe no HashMap, mas o método containsKey() deve ser usado para determinar. O valor chave de Hashtable não pode ser nulo, caso contrário: java.lang.NullPointerException.
4.HashTable usa Enumeração e HashMap usa Iterator.
As diferenças acima são apenas superficiais e suas implementações também são muito diferentes.
5. O tamanho padrão da matriz hash em HashTable é 11 e o método crescente é antigo*2+1. O tamanho padrão da matriz hash no HashMap é 16 e deve ser um expoente de 2.
6. O uso de valores hash é diferente. HashTable usa diretamente o hashCode do objeto.
Copie o código do código da seguinte forma:
int hash = key.hashCode();
índice int = (hash & 0x7FFFFFFFF)% tab.length;
HashMap recalcula o valor hash e usa AND em vez de módulo, como o método put de HashMap:
Copie o código do código da seguinte forma:
public V put(chave K, valor V) {
if (chave == nulo)
retornar putForNullKey(valor);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = tabela[i]; e != nulo; e = e.próximo) {
Objeto k;
if (e.hash == hash && ((k = e.key) == chave || key.equals(k))) {
V valor antigo = e.valor;
e.valor = valor;
e.recordAccess(este);
retornar valorantigo;
}
}
modCont++;
addEntry(hash, chave, valor, i);
retornar nulo;
}
Copie o código do código da seguinte forma:
hash int estático(int h) {
// Esta função garante que hashCodes que diferem apenas por
// múltiplos constantes em cada posição de bit têm um limite
// número de colisões (aproximadamente 8 no fator de carga padrão).
h ^= (h >>> 20) ^ (h >>> 12);
retornar h ^ (h >>> 7) ^ (h >>> 4);
}
Copie o código do código da seguinte forma:
static int indexFor(int h, int comprimento) {
retornar h & (comprimento-1);
}