clase de tabla hash
Hashtable hereda la interfaz Map e implementa una tabla hash de mapeo clave-valor. Cualquier objeto no nulo se puede utilizar como clave o valor.
Para agregar datos, use put (clave, valor) y para eliminar datos, use get (clave). El costo de tiempo de estas dos operaciones básicas es constante.
Hashtable ajusta el rendimiento a través de dos parámetros: capacidad inicial y factor de carga. Normalmente, el factor de carga predeterminado de 0,75 logra un mejor equilibrio entre tiempo y espacio. Aumentar el factor de carga puede ahorrar espacio, pero el tiempo de búsqueda correspondiente aumentará, lo que afectará operaciones como get y put.
Un ejemplo simple del uso de Hashtable es el siguiente. Coloque 1, 2 y 3 en Hashtable, y sus claves son "uno", "dos" y "tres" respectivamente:
Números de tabla hash = nueva tabla hash();
números.put(“uno”, nuevo entero(1));
números.put(“dos”, nuevo entero(2));
números.put(“tres”, nuevo entero(3));
Para recuperar 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 del valor correspondiente calculando su función hash, cualquier objeto utilizado como clave debe implementar los métodos hashCode y equals. Los métodos hashCode y equals heredan de la clase raíz Object. Si usa una clase personalizada como clave, tenga mucho cuidado de acuerdo con la definición de la función hash, si los dos objetos son iguales, es decir, obj1.equals (. obj2)=true, entonces su código hash debe ser Lo mismo, pero si 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 llama conflicto. El conflicto aumentará el costo de tiempo de operación de la tabla hash. para definirlo bien. El método hashCode() puede acelerar las operaciones de la tabla hash.
Si el mismo objeto tiene un código hash diferente, la operación de la tabla hash tendrá resultados inesperados (el método get esperado devuelve nulo). Para evitar este problema, solo necesita recordar una cosa: anular el método igual y el método hashCode al mismo tiempo. tiempo. No escribas solo 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 se trata a HashMap como una Colección (el método de valores() puede devolver una Colección), el tiempo de sobrecarga de sus suboperaciones de iteración es proporcional a la capacidad de HashMap. Por lo tanto, si el rendimiento de las operaciones iterativas es muy importante, no establezca la capacidad inicial de HashMap demasiado alta ni el factor de carga demasiado bajo.
Clase WeakHashMap
WeakHashMap es un HashMap mejorado que implementa "referencias débiles" a las claves. Si ya no se hace referencia a una clave externamente, GC puede reciclarla.
HashSet, consulte la descripción de Set
Set es una Colección que no contiene elementos duplicados, es decir, dos elementos cualesquiera e1 y e2 tienen e1.equals(e2)=false, y Set tiene como máximo un elemento nulo.
El constructor de Set tiene la restricción de que el parámetro Collection pasado no puede contener elementos duplicados.
Tenga en cuenta: los objetos mutables deben manipularse con cuidado. Si un elemento mutable en un Conjunto cambia su estado causando Object.equals(Object)=true, causará algunos problemas.
Dos implementaciones de Set comunes son HashSet y TreeSet. Decidir cuál usar es bastante sencillo. HashSet es mucho más rápido (tiempo constante frente a tiempo de registro para la mayoría de las operaciones), pero no ofrece garantías de pedido. Si necesita utilizar las operaciones en un SortedSet, o si la iteración secuencial es importante para usted, utilice un TreeSet. De lo contrario, utilice un HashSet. Es una apuesta justa que no utilices un HashSet la mayor parte del tiempo.
Una cosa que debes tener en cuenta sobre HashSets es que la iteración es lineal en términos de la suma del número de entradas y la capacidad. Por lo tanto, si el rendimiento de la iteración es importante, se debe elegir cuidadosamente una capacidad inicial adecuada. Elegir una capacidad demasiado grande desperdicia espacio y tiempo. La capacidad inicial predeterminada es 101, que generalmente es más de lo que necesita. Puede utilizar el constructor int para especificar la capacidad inicial. La capacidad inicial del HashSet a asignar es 17:
Establecer s= nuevo HashSet(17);
Los HashSets también tienen un "parámetro de ajuste" llamado factor de carga. Si está muy preocupado por el uso de espacio de su HashSet, lea el texto de HashSet para obtener más detalles. De lo contrario, utilice el valor predeterminado. Si acepta el factor de carga predeterminado, pero desea especificar una capacidad inicial, elija un número que sea aproximadamente el doble de la capacidad que espera que alcance su conjunto. Si su suposición está equivocada, puede crecer o simplemente desperdiciar un poco de espacio. Pero no hay grandes problemas. Si conoce el mejor valor para el tamaño correcto, úselo; si no lo sabe, use un valor antiguo o use un valor par. Realmente no es muy importante. Estas cosas sólo hacen que HashSet sea un poco mejor.
TreeSet no tiene parámetros de ajuste. Además de clonar, HashSet y TreeSet solo tienen aquellas operaciones requeridas por sus respectivas interfaces (Set y TreeSet), y ninguna otra operación.