Si la complejidad de tiempo de LinkedHashMap es la misma que la complejidad de HashMap, ¿por qué necesitamos HashMap? ¿Cuáles son todos los gastos generales adicionales que tiene LinkedHashMap en comparación con HashMap en Java?¿En qué se diferencia la implementación de LinkedHashMap de HashMap?
Respuesta
LinkedHashMap tomará más memoria. Cada entrada en un HashMap
normal solo tiene la clave y el valor. Cada entrada LinkedHashMap
tiene esas referencias y referencias a las entradas siguiente y anterior. También hay que hacer un poco más de limpieza, aunque eso suele ser irrelevante.
- LinkedHashMap mantiene además una lista doblemente enlazada que se ejecuta a través de todas sus entradas, que proporcionará un orden reproducible. Esta lista vinculada define el orden de iteración, que normalmente es el orden en el que las claves se insertaron en el mapa (orden de inserción).
- HashMap no tiene estos costos adicionales (tiempo de ejecución, espacio) y debería preferirse a LinkedHashMap cuando no le importe el orden de inserción.
Creo que quieres decir orden de iteración? –
@MichaelDeardeuff Tiene razón, pero la respuesta suele ser correcta porque 'iteration order = insertion order' por deafult. La posible alternativa al * orden de inserción * es un * orden de acceso *. –
LinkedHashMap es una estructura de datos útil cuando necesita conocer el orden de inserción de las claves en el Mapa. Un caso de uso adecuado es para la implementación de un caché LRU. Debido al mantenimiento de la orden de LinkedHashMap, la estructura de datos necesita memoria adicional en comparación con HashMap. En caso de que el orden de inserción no sea un requisito, siempre debe elegir el HashMap.
Si la complejidad del tiempo de LinkedHashMap es la misma que la complejidad de HashMap, ¿por qué necesitamos HashMap?
No debe confundir la complejidad con el rendimiento. Dos algoritmos pueden tener la misma complejidad, pero uno puede funcionar mejor que el otro.
Recuerde que f(N) is O(N)
significa que:
C1*N <= limit(f(N), N -> infinity) <= C2*N
donde C1
y C2
son estrictamente constantes positivas. La complejidad no dice nada acerca de cuán pequeños o grandes son los valores C
. Para dos algoritmos diferentes, las constantes probablemente sean diferentes.
(Y recuerda que las grandes-O complejidad es sobre el comportamiento/rendimiento como N
se hace muy grande. Se le dice nada sobre el comportamiento/rendimiento para las pequeñas N
valores.)
Una vez dicho esto, la diferencia en el rendimiento entre las operaciones HashMap
y LinkedHashMap
en casos de uso equivalentes es relativamente pequeña. A menudo, los gastos generales de memoria adicionales que son más relevantes.
Este es un excelente conjunto de distinciones para hacer. – Jared
Hay otra gran diferencia entre HashMap y LinkedHashMap: La iteración es más eficiente en caso de LinkedHashMap.
como elementos en LinkedHashMap están conectados entre sí de manera iteración requiere un tiempo proporcional al tamaño del mapa, independientemente de su capacidad. Pero en el caso de HashMap; ya que no hay un orden fijo, entonces la iteración sobre él requiere tiempo proporcional a su capacidad.
He puesto más detalles en mi blog.
- redimensionamiento se supone que es más rápido, ya que itera a través de su lista de doble ligado a transferir el contenido a una nueva matriz de tabla.
- containsValue() se reemplaza para aprovechar el iterador más rápido.
- LinkedHashMap también se puede usar para crear un caché LRU. Un LinkedHashMap (capacidad, loadFactor, accessOrderBoolean) constructor especial se proporciona para crear un mapa hash ligado cuyo orden de iteración es el orden en que sus entradas se accedió por última, desde menos recientemente acceder a más recientemente. En este caso, simplemente consultar el mapa con get() es una modificación estructural.
LinkedHashMap hereda HashMap, lo que significa que utiliza la implementación existente de HashMap para almacenar clave y valores en un nodo (objeto de entrada). Aparte de esto, almacena una implementación de lista doblemente vinculada para mantener el orden de inserción en el que se han ingresado las claves.
Parece que este:
nodo de cabecera < ---> nodo 1 < ---> nodo 2 < ---> nodo 3 < ----> nodo 4 < ---> cabecera nodo.
Así que la sobrecarga adicional es mantener la inserción y eliminación en esta lista doblemente vinculada. El beneficio es: la orden de iteración está garantizada para ser un pedido de inserción, que no está en HashMap.
HashMap
no mantiene el orden de inserción, por lo tanto, no mantiene ninguna lista doblemente vinculada.
La característica más destacada de LinkedHashMap
es que mantiene el orden de inserción de pares de valores-clave. LinkedHashMap
usa la Lista doblemente enlazada para hacerlo.
entrada de LinkedHashMap
se ve así:
static class Entry<K, V> {
K key;
V value;
Entry<K,V> next;
Entry<K,V> before, after; //For maintaining insertion order
public Entry(K key, V value, Entry<K,V> next){
this.key = key;
this.value = value;
this.next = next;
}
}
Al utilizar antes y después - hacemos un seguimiento de entrada recién añadido en LinkedHashMap
, que nos ayuda a mantener el orden de inserción.
Antes consulte la entrada anterior y después se refiere a la siguiente entrada en LinkedHashMap
.
Para diagramas y explicación paso a paso por favor referirse http://www.javamadesoeasy.com/2015/02/linkedhashmap-custom-implementation.html
- 1. LinkedHashMap vs HashMap! = LinkedList vs ArrayList
- 2. Implementación de un HashMap
- 3. Implementación de HashMap personalizada
- 4. LinkedHashMap firma
- 5. Implementación de hashmap simple en C++
- 6. Diferencia entre HashSet y HashMap?
- 7. hashmap de memoria baja recomendado para la implementación de Java
- 8. ¿Por qué la implementación de HashSet en Sun Java usa HashMap como respaldo?
- 9. ¿En qué se diferencia MegaStore de BigTable?
- 10. Obtiene el primer ítem de linkedhashmap
- 11. Equivalente para LinkedHashMap en Python
- 12. Diferencia entre HashMap y Map en Java ...?
- 13. Shrink LinkedHashMap en Java
- 14. ¿Por qué LinkedHashMap no proporciona acceso por índice?
- 15. Diferencia entre Hashtable y Collections.synchronizedMap (HashMap)
- 16. Implementando un LinkedHashMap concurrente
- 17. cuál es la diferencia entre mapa y hashmap en STL
- 18. LinkedHashMap en .NET
- 19. Implementación Hashmap para contar las ocurrencias de cada carácter
- 20. ¿Qué es LinkedHashMap <k, v>?
- 21. Diferencia de HashMap en alt-rt.jar y rt.jar?
- 22. Ordenando LinkedHashMap
- 23. ¿En qué se diferencia una implementación esquelética de una clase abstracta ordinaria?
- 24. ¿Por qué Java HashMap nativo en Clojure se ejecuta lentamente?
- 25. Asignación de Hashmap a Hashmap
- 26. ¿En qué se diferencia engine.io de socket.io?
- 27. serialize/deserialize un LinkedHashMap (android) java
- 28. ¿En qué se diferencia la arquitectura x64 de x86
- 29. ¿En qué se diferencia la raqueta de Scheme?
- 30. ¿En qué se diferencia Mesa de los controladores OpenGL?
Como resultado, el rendimiento es ligeramente menor en comparación a la de HashMap. – Snehal
@Jon Skeet ¿Es como los valores en caso de que LinkedHashMap consista en referencias adicionales al valor anterior y siguiente, la eliminación o la inserción de cualquier elemento implicaría un costo adicional para la reconexión también? Sería genial si obtengo la implementación completa, ya sea que tenga un enlace o se lo explique. –
@Programador apasionado: el código fuente está a disposición del público; ¿por qué no mirar allí? Y sí, la inserción y la eliminación requieren que la lista vinculada se actualice. –