¿Cuál es la diferencia entre HashMap
, LinkedHashMap
y TreeMap
en Java? No veo ninguna diferencia en la salida ya que los tres tienen keySet
y values
. ¿Qué son los Hashtable
s?
Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());
SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());
LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());
Hashtable
yHashMap
es que en un Hashtable, "ni la clave ni el valor pueden ser nulos". Esta restricción no existe en este último.Prefiero la presentación visual:
fuente
Los tres representan la asignación de claves únicas a valores y, por lo tanto, implementan la interfaz Map .
HashMap es un mapa basado en el hash de las claves. Admite operaciones de obtención / colocación de O (1). Las claves deben tener implementaciones consistentes de
hashCode()
yequals()
para que esto funcione.LinkedHashMap es muy similar a HashMap, pero agrega conciencia al orden en el que se agregan los elementos (o se accede a ellos), por lo que el orden de iteración es el mismo que el orden de inserción (u orden de acceso, según los parámetros de construcción).
TreeMap es un mapeo basado en árboles. Sus operaciones put / get toman tiempo O (log n). Requiere que los elementos tengan algún mecanismo de comparación, ya sea con Comparable o Comparator. El orden de iteración está determinado por este mecanismo.
fuente
LinkedHashMap
iterará en el orden de inserción, no en el orden natural. Entonces, si agrega(2,5,3)
a aLinkedHashMap
y hace un para cada sobre él, volverá2,5,3
. Si fuera2,5,3
aTreeMap
, volverá2,3,5
.Vea dónde está cada clase en la jerarquía de clases en el siguiente diagrama ( uno más grande ). TreeMap implementa
SortedMap
yNavigableMap
mientrasHashMap
que no.HashTable
es obsoleto y seConcurrentHashMap
debe usar la clase correspondiente .fuente
HashMap
Tabla de picadillo
LinkedHashMap
TreeMap
fuente
Solo un poco más de información de mi propia experiencia con los mapas, sobre cuándo usaría cada uno:
removeEldestEntry()
método. Esto le permite crear un objeto de caché que puede expirar datos utilizando algunos criterios que defina.fuente
Las tres clases
HashMap
,TreeMap
eLinkedHashMap
implementa lajava.util.Map
interfaz, y representa la asignación de clave única a valores.HashMap
A
HashMap
contiene valores basados en la clave.Contiene solo elementos únicos.
Puede tener una clave nula y múltiples valores nulos.
No mantiene orden .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
LinkedHashMap
LinkedHashMap
contiene valores basados en la clave.Es lo mismo que HashMap en su lugar mantiene el orden de inserción . // Ver la desaceleración de la clase a continuación
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
TreeMap
TreeMap
contiene valores basados en la clave. Implementa la interfaz NavigableMap y extiende la clase AbstractMap.Es lo mismo que en su
HashMap
lugar mantiene el orden ascendente (Ordenado usando el orden natural de su clave).public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
Tabla de picadillo
Es una clase heredada.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
Ref: http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html
fuente
Mira cómo varía el rendimiento ...
Mapa de árbol que es una implementación del mapa ordenado. La complejidad de la operación de poner, obtener y contiene clave es O (log n) debido al orden natural
fuente
@Amit:
SortedMap
es una interfaz, mientras queTreeMap
es una clase que implementa laSortedMap
interfaz. Eso significa que sigue el protocolo queSortedMap
le pide a sus implementadores que hagan. Un árbol, a menos que se implemente como árbol de búsqueda, no puede proporcionarle datos ordenados porque el árbol puede ser cualquier tipo de árbol. Entonces, para que TreeMap funcione como orden ordenado, implementa SortedMap (por ejemplo, Binary Search Tree - BST, BST balanceado como AVL y RB Tree, incluso Ternary Search Tree, utilizado principalmente para búsquedas iterativas en forma ordenada).En NUT-SHELL
HashMap
: da datos en O (1), sin ordenarTreeMap
: da datos en O (log N), base 2. con claves ordenadasLinkedHashMap
: es una tabla Hash con capacidad de lista vinculada (piense en indexed-SkipList) para almacenar datos en la forma en que se insertan en el árbol. El más adecuado para implementar LRU (menos utilizado recientemente).fuente
Los siguientes son las principales diferencias entre HashMap y TreeMap
HashMap no mantiene ningún orden. En otras palabras, HashMap no proporciona ninguna garantía de que el elemento insertado primero se imprima primero, mientras que, al igual que TreeSet, los elementos TreeMap también se ordenan según el orden natural de sus elementos.
La implementación interna de HashMap usa Hashing y TreeMap usa internamente la implementación de árbol Rojo-Negro.
HashMap puede almacenar una clave nula y muchos valores nulos. TreeMap no puede contener claves nulas pero puede contener muchos valores nulos.
HashMap toma un rendimiento de tiempo constante para las operaciones básicas como get and put, es decir, O (1). Según los documentos de Oracle, TreeMap proporciona un costo de tiempo de registro (n) garantizado para el método get y put.
HashMap es mucho más rápido que TreeMap, ya que el tiempo de rendimiento de HashMap es constante con respecto al tiempo de registro TreeMap para la mayoría de las operaciones.
HashMap usa el método equals () en comparación, mientras que TreeMap usa el método compareTo () para mantener el orden.
HashMap implementa la interfaz Map mientras que TreeMap implementa la interfaz NavigableMap.
fuente
Estas son implementaciones diferentes de la misma interfaz. Cada implementación tiene algunas ventajas y desventajas (inserción rápida, búsqueda lenta) o viceversa.
Para obtener más información, consulte el javadoc de TreeMap , HashMap , LinkedHashMap .
fuente
El mapa hash no conserva el orden de inserción.
Ejemplo. Hashmap Si está insertando claves como
Puede almacenarlo como
Linked Hashmap conserva el orden de inserción.
Ejemplo.
Si está insertando claves
Lo almacenará como
lo mismo que insertamos
El mapa de árbol almacena los valles en orden creciente de llaves. Ejemplo.
Si está insertando claves
Lo almacenará como
fuente
HashMap:
LinkedHashMap:
TreeMap:
fuente
Todos ofrecen un mapa clave-> valor y una forma de recorrer las teclas. La distinción más importante entre estas clases son las garantías de tiempo y el orden de las claves.
Imagina que pasaste un TreeMap, HashMap y LinkedHashMap vacíos a la siguiente función:
El resultado para cada uno se verá como los resultados a continuación.
Para HashMap, la salida fue, en mis propias pruebas, {0, 1, -1}, pero podría ser cualquier orden. No hay garantía en el pedido.
Mapa de árbol, la salida fue, {-1, 0, 1}
LinkedList, la salida fue, {1, -1, 0}
fuente
Si bien hay muchas respuestas excelentes aquí, me gustaría presentar mi propia tabla que describe las diversas
Map
implementaciones incluidas con Java 11.Podemos ver estas diferencias en el gráfico de la tabla:
HashMap
es el propósito generalMap
comúnmente usado cuando no tienes necesidades especiales.LinkedHashMap
se extiendeHashMap
, agregando este comportamiento: Mantiene un orden, el orden en que se agregaron originalmente las entradas . La alteración del valor para la entrada de valor clave no altera su lugar en el orden.TreeMap
también mantiene un orden, pero usa (a) el orden "natural" , que significa el valor delcompareTo
método en los objetos clave definidos en laComparable
interfaz, o (b) invoca unaComparator
implementación que usted proporciona.TreeMap
implementa tanto laSortedMap
interfaz como su sucesor, laNavigableMap
interfaz.TreeMap
Qué no permiten un NULL como la clave , mientras queHashMap
yLinkedHashMap
lo hacen.HashTable
es heredado , de Java 1 . Suplantado por laConcurrentHashMap
clase. Citando el Javadoc:ConcurrentHashMap
obedece la misma especificación funcionalHashtable
e incluye versiones de los métodos correspondientes a cada método deHashtable
.fuente
HashMap
puede contener una clave nula.
HashMap no mantiene ningún orden.
TreeMap
TreeMap no puede contener ninguna clave nula.
TreeMap mantiene el orden ascendente.
LinkedHashMap
LinkedHashMap se puede utilizar para mantener el orden de inserción, en el que se insertan las claves en el Mapa o también se puede utilizar para mantener un orden de acceso, en el que se accede a las claves.
Ejemplos ::
1) Mapa de HashMap = nuevo HashMap ();
2) Mapa de TreeMap = nuevo TreeMap ();
3) Mapa LinkedHashMap = nuevo LinkedHashMap ();
fuente
El más importante entre los tres es cómo guardan el orden de las entradas.
HashMap
- No guarda el orden de las entradas. p.ej.LinkedHashMap
: Guarda el orden en que se hicieron las entradas. p.ej:TreeMap
: Guarda las entradas en orden ascendente de las teclas. p.ej:fuente