A diferença entre HashTable e HashMap
Primeiro, as classes-pai herdadas são diferentes.
Hashtable herda da classe Dictionary, enquanto HashMap herda da classe AbstractMap. Mas ambos implementam a interface Map.
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, Serializable
classe pública HashMap<K,V>
estende AbstractMap<K,V>
implementa Map<K,V>, Cloneable, Serializable
Em segundo lugar, a segurança do thread é diferente.
Os métodos em Hashtable são sincronizados, enquanto os métodos em HashMap não são sincronizados por padrão. Em um ambiente simultâneo multithread, você pode usar o Hashtable diretamente, sem sincronizar seus métodos. No entanto, ao usar o HashMap, você mesmo deve adicionar o processamento de sincronização.
Terceiro, se deve fornecer o método contains?
HashMap removeu o método contains de Hashtable e alterou-o para containsValue e containsKey, porque o método contains é facilmente enganoso.
Hashtable retém três métodos: contains, containsValue e containsKey, entre os quais contains e containsValue possuem as mesmas funções.
Quarto, se a chave e o valor permitem valores nulos.
A chave e o valor são objetos e não podem conter chaves duplicadas, mas podem conter valores duplicados.
Em Hashtable, valores nulos não são permitidos tanto na chave quanto no valor.
No HashMap, null pode ser usado como chave, e existe apenas uma dessas chaves; pode haver uma ou mais chaves cujo valor correspondente seja nulo; Quando o método get() retorna um valor nulo, pode ser que a chave não exista no HashMap, ou o valor correspondente à chave pode ser 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.
Quinto, a implementação interna dos dois métodos de travessia é diferente.
Tanto Hashtable quanto HashMap usam Iterator. Por razões históricas, Hashtable também usa Enumeração.
Sexto, os valores de hash são diferentes.
O uso de valores hash é diferente. HashTable usa diretamente o hashCode do objeto. E o HashMap recalcula o valor do hash.
Sétimo, a implementação interna usa diferentes métodos de inicialização e expansão de array.
O tamanho inicial e os métodos de expansão de arrays nas duas implementações internas de Hashtable e HashMap. 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.