Quelle est la différence entre HashMap
, LinkedHashMap
et TreeMap
en Java? Je ne vois aucune différence dans la sortie car tous les trois ont keySet
et values
. Que sont 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());
Les trois classes implémentent l'interface Map
et offrent essentiellement les mêmes fonctionnalités. La différence la plus importante est l'ordre dans lequel l'itération à travers les entrées se produira:
HashMap
ne fait aucune garantie quant à l'ordre des itérations. Il peut (et va) même changer complètement lorsque de nouveaux éléments sont ajoutés.TreeMap
effectuera une itération en fonction de la "commande naturelle" des touches selon leur méthode compareTo()
(ou une méthode Comparator
fournie de l'extérieur). En outre, il implémente l'interface SortedMap
, qui contient des méthodes qui dépendent de cet ordre de tri.LinkedHashMap
itérera dans l'ordre dans lequel les entrées ont été placées dans la carte"Hashtable" est le nom générique des cartes basées sur le hachage. Dans le contexte de l'API Java, Hashtable
est une classe obsolète du temps de Java 1.1 avant l'existence de l'infrastructure de collections. Il ne devrait plus être utilisé, car son API est encombrée de méthodes obsolètes qui dupliquent les fonctionnalités et ses méthodes sont synchronisées (ce qui peut réduire les performances et est généralement inutile). Utilisez ConcurrentHashMap au lieu de Hashtable.
Je préfère la présentation visuelle:
╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║ Property ║ HashMap ║ TreeMap ║ LinkedHashMap ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration ║ no guarantee order ║ sorted according ║ ║
║ Order ║ will remain constant║ to the natural ║ insertion-order ║
║ ║ over time ║ ordering ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Get/put ║ ║ ║ ║
║ remove ║ O(1) ║ O(log(n)) ║ O(1) ║
║ containsKey ║ ║ ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ ║ ║ NavigableMap ║ ║
║ Interfaces ║ Map ║ Map ║ Map ║
║ ║ ║ SortedMap ║ ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ ║ ║ ║ ║
║ Null ║ allowed ║ only values ║ allowed ║
║ values/keys ║ ║ ║ ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║ ║ Fail-fast behavior of an iterator cannot be guaranteed ║
║ Fail-fast ║ impossible to make any hard guarantees in the presence of ║
║ behavior ║ unsynchronized concurrent modification ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║ ║ ║ ║ ║
║Implementation║ buckets ║ Red-Black Tree ║ double-linked ║
║ ║ ║ ║ buckets ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║ Is ║ ║
║ synchronized ║ implementation is not synchronized ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝
Tous les trois représentent un mappage de clés uniques en valeurs et implémentent donc l'interface Map .
HashMap est une carte basée sur hachage des clés. Il supporte O(1) opérations get/put. Les clés doivent avoir implémentations cohérentes de hashCode()
et equals()
pour que cela fonctionne.
LinkedHashMap est très similaire à HashMap, mais il ajoute une conscience à l'ordre d'ajout (ou d'accès) aux éléments. L'ordre des itérations est donc identique à l'ordre d'insertion (ou à l'ordre d'accès, en fonction des paramètres de construction).
TreeMap est un mappage basé sur une arborescence. Ses opérations put/get prennent O (log n) time. Les articles doivent avoir un mécanisme de comparaison, avec Comparable ou Comparator. L'ordre des itérations est déterminé par ce mécanisme.
Voyez où se trouve chaque classe dans la hiérarchie de classes dans le diagramme suivant ( le plus grand ). TreeMap implémente SortedMap
et NavigableMap
alors que HashMap
ne le fait pas.
HashTable
est obsolète et la classe ConcurrentHashMap
correspondante doit être utilisée.
Juste un peu plus de ma propre expérience avec les cartes, quand je les utiliserais:
removeEldestEntry()
. Cela vous permet de créer un objet Cache pouvant expirer des données en utilisant certains critères que vous définissez.Les trois classes HashMap
, TreeMap
et LinkedHashMap
implémentent l'interface Java.util.Map
et représentent le mappage d'une clé unique vers une valeur.
Un HashMap
contient des valeurs basées sur la clé.
Il ne contient que des éléments uniques.
Il peut avoir une clé NULL et plusieurs valeurs NULL.
Il ne maintient aucune commande .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
LinkedHashMap
contient des valeurs basées sur la clé.Il en va de même que HashMap conserve à la place l'ordre d'insertion . // Voir décélération de classe ci-dessous
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
TreeMap
contient des valeurs basées sur la clé. Il implémente l'interface NavigableMap et étend la classe AbstractMap.Il est identique à HashMap
à la place, conserve un ordre croissant (trié selon l'ordre naturel de sa clé.).
public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
C'est une classe d'héritage.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable
HashMap n'offre aucune garantie quant à l'ordre des itérations. Il peut (et va) même changer complètement lorsque de nouveaux éléments sont ajoutés. TreeMap itérera en fonction de "l'ordre naturel" des clés en fonction de leur méthode compareTo () (ou d'un comparateur fourni en externe). En outre, il implémente l'interface SortedMap, qui contient des méthodes qui dépendent de cet ordre de tri. LinkedHashMap itérera dans l'ordre dans lequel les entrées ont été placées dans la carte
Regardez comment les performances varient ..
Carte de l'arbre qui est une implémentation de la carte triée. La complexité de l'opération put, get et containsKey est O (log n) en raison de l'ordre naturel
@Amit: SortedMap
est une interface alors que TreeMap
est une classe qui implémente l'interface SortedMap
. Cela signifie que si suit le protocole que SortedMap
demande à ses développeurs de faire. Un arbre, à moins d'être implémenté en tant qu'arbre de recherche, ne peut pas vous donner les données commandées, car il peut s'agir de n'importe quel type d'arbre. Ainsi, pour que TreeMap fonctionne comme un ordre trié, il implémente SortedMap (par exemple, arbre de recherche binaire - BST, BST équilibré comme AVL et R-B, voire arbre de recherche ternaire - principalement utilisé pour des recherches itératives de manière ordonnée).
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
Dans NUT-Shell HashMap
: donne des données dans O(1), aucun ordre
TreeMap
: donne les données en O (log N), base 2. avec clés ordonnées
LinkedHashMap
: est une table de hachage avec liste (pensez à indexed-SkipList) pour stocker des données de la manière dont elles sont insérées dans l'arborescence. Le mieux adapté pour mettre en œuvre LRU (moins récemment utilisé).
Voici la différence majeure entre HashMap et TreeMap
HashMap ne maintient aucun ordre. En d'autres termes, HashMap ne fournit aucune garantie que l'élément inséré en premier sera imprimé en premier, car, tout comme TreeSet, les éléments TreeMap sont également triés selon l'ordre naturel de leurs éléments.
Utilisation de l'implémentation HashMap interne Hashing et TreeMap utilisent l'implémentation de l'arborescence rouge-noir.
HashMap peut stocker une clé NULL et plusieurs valeurs NULL. TreeMap ne peut pas contenir de clé NULL, mais peut contenir de nombreuses valeurs NULL.
HashMap prend des performances constantes dans le temps pour les opérations de base telles que get et put i.e O (1). Conformément aux documents Oracle, TreeMap fournit un coût journalier garanti pour la méthode get et put.
HashMap est beaucoup plus rapide que TreeMap, car le temps d'exécution de HashMap est constant par rapport au temps de journalisation TreeMap pour la plupart des opérations.
HashMap utilise la méthode equals () en comparaison, tandis que TreeMap utilise la méthode compareTo () pour maintenir l'ordre.
HashMap implémente l'interface Map tandis que TreeMap implémente l'interface NavigableMap.
Ce sont des implémentations différentes de la même interface. Chaque implémentation présente des avantages et des inconvénients (insertion rapide, recherche lente) ou inversement.
Pour plus de détails, consultez le javadoc de TreeMap , HashMap , LinkedHashMap .
HashMap:
LinkedHashMap:
TreeMap:
La carte de hachage ne conserve pas l'ordre d'insertion.
Exemple. Hashmap Si vous insérez des clés en tant que
1 3
5 9
4 6
7 15
3 10
Il peut stocker comme
4 6
5 9
3 10
1 3
7 15
Hashmap lié conserve l'ordre d'insertion.
Exemple.
Si vous insérez des clés
1 3
5 9
4 6
7 15
3 10
Il va stocker comme
1 3
5 9
4 6
7 15
3 10
même que nous insérons.
La carte des arbres stocke les valeurs dans l'ordre croissant des clés. Exemple.
Si vous insérez des clés
1 3
5 9
4 6
7 15
3 10
Il va stocker comme
1 3
3 10
4 6
5 9
7 15
Tous offrent une carte clé-> valeur et un moyen de parcourir les clés. La distinction la plus importante entre ces classes concerne les garanties de temps et l’ordre des clés.
Imaginez que vous ayez passé un TreeMap, HashMap et LinkedHashMap vide dans la fonction suivante:
void insertAndPrint(AbstractMap<Integer, String> map) {
int[] array= {1, -1, 0};
for (int x : array) {
map.put(x, Integer.toString(x));
}
for (int k: map.keySet()) {
System.out.print(k + ", ");
}
}
La sortie pour chacun ressemblera aux résultats ci-dessous.
Pour HashMap, le résultat était, dans mes propres tests, {0, 1, -1}, mais il pourrait s'agir de n'importe quel ordre. Il n'y a aucune garantie sur la commande.
Treemap, la sortie était, {-1, 0, 1}
LinkedList, la sortie était, {1, -1, 0}
HashMap
peut contenir une clé nulle.
HashMap ne maintient aucun ordre.
TreeMap
TreeMap ne peut contenir aucune clé NULL.
TreeMap maintient l'ordre croissant.
LinkedHashMap
LinkedHashMap peut être utilisé pour maintenir l'ordre d'insertion, sur lequel les clés sont insérées dans Map, ou il peut également être utilisé pour maintenir un ordre d'accès, sur lequel les clés sont utilisées.
Exemples ::
1) Carte HashMap = new HashMap ();
map.put(null, "Kamran");
map.put(2, "ALi");
map.put(5, "From");
map.put(4, "Dir");`enter code here`
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
2) Carte TreeMap = new TreeMap ();
map.put(1, "Kamran");
map.put(2, "ALi");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
3) carte LinkedHashMap = new LinkedHashMap ();
map.put(1, "Kamran");
map.put(2, "ALi");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}