1. Hashtable es una subclase de Dictionary.
Copie el código de código de la siguiente manera:
tabla hash de clase pública<K,V>
extiende Diccionario<K,V>
implementa Map<K,V>, Cloneable, java.io.Serializable
Mapa Hash:
Copie el código de código de la siguiente manera:
clase pública HashMap<K,V>
extiende AbstractMap<K,V>
implementa Map<K,V>, clonable, serializable
HashMap y Hashtable son clases de implementación de la interfaz Map;
2. Los métodos en Hashtable son sincrónicos (), pero los métodos en HashMap no son sincrónicos de forma predeterminada. Es decir, en aplicaciones de subprocesos múltiples, Hashtable se puede usar de manera segura sin operaciones especiales para HashMap y se requiere un mecanismo de sincronización adicional; Pero el problema de sincronización de HashMap se puede resolver mediante un método estático de Colecciones:
Copie el código de código de la siguiente manera:
Mapa público estático <K,V><K,V> mapa sincronizado(Mapa<K,V> m)
Este método devuelve un mapa sincronizado, lo que significa que el mapa devuelto es seguro para subprocesos. Cabe señalar que al iterar sobre el mapa devuelto, debe sincronizar manualmente en el mapa devuelto; de lo contrario, se producirá un comportamiento indefinido:
Copie el código de código de la siguiente manera:
Mapa m = Collections.synchronizedMap(new HashMap());
...
Set s = m.keySet(); // No es necesario que esté en el bloque sincronizado
...
sincronizado(m) { // ¡Sincronizando en m, no en s!
Iterador i = s.iterator(); // Debe estar en un bloque sincronizado
mientras (i.hasNext())
foo(i.siguiente());
}
3. En HashMap, se puede utilizar nulo como clave, y solo existe una clave de este tipo; puede haber una o más claves cuyo valor correspondiente sea nulo; Cuando el método get() devuelve un valor nulo, puede significar que la clave no existe en el HashMap, o también puede significar que el valor correspondiente a la clave es nulo. Por lo tanto, en HashMap, el método get () no se puede usar para determinar si existe una determinada clave en HashMap, pero se debe usar el método contieneKey () para determinar. El valor clave de Hashtable no puede ser nulo; de lo contrario: java.lang.NullPointerException.
4.HashTable usa Enumeración y HashMap usa Iterador.
Las anteriores son solo diferencias superficiales y sus implementaciones también son muy diferentes.
5. El tamaño predeterminado de la matriz hash en HashTable es 11 y el método de aumento es antiguo * 2 + 1. El tamaño predeterminado de la matriz hash en HashMap es 16 y debe ser un exponente de 2.
6. El uso de valores hash es diferente. HashTable usa directamente el código hash del objeto.
Copie el código de código de la siguiente manera:
int hash = clave.hashCode();
int index = (hash & 0x7FFFFFFFF) % tab.length;
HashMap recalcula el valor hash y usa AND en lugar de módulo, como el método put de HashMap:
Copie el código de código de la siguiente manera:
public V put (clave K, valor V) {
si (clave == nula)
devolver putForNullKey(valor);
int hash = hash(key.hashCode());
int i = indexFor(hash, tabla.longitud);
for (Entrada<K,V> e = tabla[i]; e != nulo; e = e.next) {
Objeto k;
if (e.hash == hash && ((k = e.key) == clave || key.equals(k))) {
V oldValue = e.valor;
e.valor = valor;
e.recordAccess(esto);
devolver valor antiguo;
}
}
modCount++;
addEntry(hash, clave, valor, i);
devolver nulo;
}
Copie el código de código de la siguiente manera:
hash int estático (int h) {
// Esta función garantiza que los códigos hash que difieren sólo en
// los múltiplos constantes en cada posición de bit tienen un límite
// número de colisiones (aproximadamente 8 con el factor de carga predeterminado).
h ^= (h >>> 20) ^ (h >>> 12);
devolver h ^ (h >>> 7) ^ (h >>> 4);
}
Copie el código de código de la siguiente manera:
estático int indexFor(int h, int longitud) {
devolver h & (longitud-1);
}