¿Cuáles son las similitudes y diferencias entre la interfaz Map, HashMap y HashTable?
1. Hashtable es una subclase de Dictionary y HashMap es la implementación de la interfaz Map
2. Los métodos en HashMap Methods son asincrónicos de forma predeterminada. Es decir, en aplicaciones multiproceso, no se requieren operaciones especiales para utilizar Hashtable de forma segura; en el caso de HashMap, se requieren mecanismos de sincronización adicionales; Pero la sincronización de HashMap se puede resolver mediante un método estático de Colecciones:
Map Collections.synchronizedMap(Map m)
Este método devuelve un mapa sincronizado, que encapsula el HashMap subyacente. Los métodos hacen que el HashMap subyacente sea seguro incluso en entornos de subprocesos múltiples.
3. En HashMap, puede usar nulo como clave, de modo que solo haya una clave y también puede tener una o más claves correspondientes al valor de nulo. Cuando el método get() devuelve un valor nulo, puede significar que no existe dicha clave en el HashMap, o puede significar que la clave corresponde a un valor nulo.
Mapa
├Γé¼ΓäóHashtable
├Γé¼ΓäóHashMap
└WeakHashMap
Interfaz de mapa
Tenga en cuenta que Map no hereda de la interfaz de Colección y Map proporciona una asignación de claves a valores. La interfaz de Map proporciona tres vistas de colección. El contenido de Map se puede ver como colecciones de colecciones de claves, colecciones de colecciones de valores o colecciones de mapeo de valores-clave. Cualquier objeto no nulo se puede utilizar como clave o valor.
Utilice put(key, value) para agregar datos y get(key) para recuperar datos. El costo de tiempo de estas dos operaciones básicas es constante.
El rendimiento de Hashtable se ajusta mediante dos parámetros: capacidad inicial y factor de carga. El factor de carga predeterminado es 0,75, que generalmente es un buen equilibrio entre tiempo y espacio. Aumentar el factor de carga ahorra espacio pero aumenta el tiempo de búsqueda, lo que afecta operaciones como get y put. put("dos", new Integer(2));
números.put("tres", new Integer(3));
Para sacar un número, como "2", utilice la clave correspondiente:
Entero n = (Entero)números.get("dos");
System.out.println("dos = " + n) ;
Dado que el objeto utilizado como clave determinará la posición de su valor correspondiente calculando su función hash, cualquier objeto utilizado como clave debe implementar los métodos hashCode y equals, obj1.equals(obj2 ) = verdadero, su código hash debe ser el mismo, pero si los dos objetos son diferentes, su código hash no es necesariamente diferente. Si el código hash de dos objetos diferentes es el mismo, este fenómeno se denomina conflicto y el conflicto provocará el conflicto. funcionamiento de la llave. Este fenómeno se llama conflicto. Los conflictos aumentarán el tiempo de operación de la tabla hash. Por lo tanto, intente definir un buen método hashCode () para acelerar el funcionamiento de la tabla hash.
Si el mismo objeto tiene un código hash diferente, la operación de la tabla hash producirá resultados inesperados (se espera que el método get devuelva un valor nulo). Para evitar este tipo de problemas, solo recuerde una cosa: reescribir al mismo tiempo. el tiempo es igual al método y al método hashCode en lugar de simplemente anular uno de ellos.
Hashtable es sincrónico.
Clase HashMap
HashMap es similar a Hashtable, excepto que HashMap es asíncrono y permite valores nulos, es decir, valores nulos y claves nulas. Pero cuando un HashMap se trata como una colección (el método de valores () puede devolver una colección), el costo del tiempo de operación del iterador es proporcional a la capacidad del HashMap. Por lo tanto, si el rendimiento de la operación de iteración es importante, no establezca la capacidad inicial de HashMap demasiado alta ni el factor de carga demasiado bajo. Clase WeakHashMap
WeakHashMap es una mejora de HashMap, que implementa "referencias débiles" a las claves. "Si ya no se hace referencia externa a una clave, GC puede reclamarla.