ventajas tablas tabla resolucion las implementacion generica desventajas colisiones aplicaciones java hashtable linkedhashmap

java - resolucion - tablas hash python



Cómo mantener el orden de los elementos en la tabla hash. (5)

Estoy bastante seguro de que la razón por la cual las tablas hash no están clasificadas es para ayudar a la velocidad de almacenamiento y recuperación. Debido a esto, sugeriría usar una estructura externa para mantener el orden y simplemente usar la tabla hash para almacenar valores (para una búsqueda rápida).

Tengo una tabla hash. El método de valores () devuelve valores en un orden diferente al orden en el que estoy insertado. ¿Cómo puedo obtener los valores en el mismo orden en el que inserté? El uso de LinkedHashmap es una alternativa pero no está sincronizado.


Puede envolver un LinkedHashMap y sincronizar o puede usar la utilidad Collections.synchronizedMap para crear un LinkedHashMap sincronizado:

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

Desde el JavaDoc:

Si varios subprocesos acceden a un mapa hash vinculado simultáneamente, y al menos uno de los subprocesos modifica el mapa estructuralmente, debe sincronizarse externamente. Esto se logra normalmente mediante la sincronización en algún objeto que naturalmente encapsula el mapa. Si no existe tal objeto, el mapa debe "ajustarse" utilizando el método Collections.synchronizedMap. Esto se hace mejor en el momento de la creación, para evitar el acceso accidental no sincronizado al mapa


Si jdk1.6 tiene solo dos tipos de mapas ordenados EnumMap y LinkedHashMap. Ambos no están sincronizados. Si solo necesitas recordar el pedido, usa

Map m = Collections.synchronizedMap(new LinkedHashMap(...));

Si desea ordenar, utilice ConcurrentSkipListMap


Una tabla hash está intrínsecamente desordenada, por lo que está utilizando la estructura de datos incorrecta. Como no especifica el idioma que está utilizando, no puedo sugerir una alternativa, pero necesita algún tipo de conjunto de clave / valor ordenado.


Utilice un LinkedHashMap .

Implementación de tabla de hash y lista enlazada de la interfaz del Map , con orden de iteración predecible. Esta implementación difiere de HashMap en que mantiene una lista con un enlace doble que se ejecuta en todas sus entradas. Esta lista enlazada define el orden de iteración, que normalmente es el orden en que se insertaron las claves en el mapa ( orden de inserción ). Tenga en cuenta que el orden de inserción no se ve afectado si una clave se reinserta en el mapa. (Una clave k se reinserta en un mapa m si m.put(k, v) se invoca cuando m.containsKey(k) devolverá true inmediatamente antes de la invocación).

combinado con Collections.synchronizedMap() .

Así por ejemplo:

Map<String, String> map = Collections.synchronizedMap( new LinkedHashMap<String, String>());