1050 votes

Différence entre HashMap, LinkedHashMap et TreeMap

Quelle est la différence entre HashMap , LinkedHashMap y TreeMap en Java ? Je ne vois pas de différence dans la sortie car les trois a keySet y values . Quels sont les 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());

1795voto

shevchik Points 6781

Je préfère la présentation visuelle :

Propriété

HashMap

TreeMap

Cartouche de hachage

Ordre d'itération

aucun ordre garanti, restera constant dans le temps

triés selon l'ordre naturel

ordre d'insertion

Get / put / remove / containsKey

O(1)

O(log(n))

O(1)

Interfaces

Carte

NavigableMap, Map, SortedMap

Carte

Valeurs/clés nulles

autorisé

valeurs uniques

autorisé

Comportement en cas de défaillance rapide

Le comportement infaillible d'un itérateur ne peut être garanti, il est impossible de faire des garanties solides en présence de modifications concurrentes non synchronisées.

Le comportement infaillible d'un itérateur ne peut être garanti, il est impossible de faire des garanties solides en présence de modifications concurrentes non synchronisées.

Le comportement infaillible d'un itérateur ne peut être garanti, il est impossible de faire des garanties solides en présence de modifications concurrentes non synchronisées.

Mise en œuvre

seaux

Arbre rouge-noir

seaux à double lien

Est synchronisé

l'implémentation n'est pas synchronisée

l'implémentation n'est pas synchronisée

l'implémentation n'est pas synchronisée

3 votes

Merci pour cette présentation visuelle. Pouvez-vous fournir quelques liens pour la présentation visuelle de List and Set. Merci encore.

18 votes

En plus de l'ordre d'insertion, LinkedHashMap supporte également l'ordre d'accès (en utilisant le constructeur avec le paramètre booléen access-order).

8 votes

Seaux à double lien ? Je pense que cela ajoute une surcharge inutile de recherche du seau pour les opérations d'insertion/suppression (parce qu'il faut chercher le bon seau pour y mettre l'objet). J'ai toujours pensé que les implémentations de LinkedHashMap seraient similaires à celles d'une Map mais avec une petite surcharge supplémentaire de "liste d'entrées" (peut-être sous forme de liste chaînée) utilisée à des fins d'itération. Êtes-vous sûr, Shevchyk ? Si oui, pouvez-vous expliquer ou me donner quelques liens en ligne qui soutiennent votre déclaration ?

1237voto

Michael Borgwardt Points 181658

Ces trois classes mettent en œuvre la fonction Map et offrent pratiquement les mêmes fonctionnalités. La différence la plus importante est l'ordre dans lequel l'itération des entrées se fait :

  • HashMap ne donne absolument aucune garantie quant à l'ordre d'itération. 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 compareTo() (ou une méthode Comparator ). En outre, il met en œuvre la méthode SortedMap qui contient des méthodes qui dépendent de cet ordre de tri.
  • LinkedHashMap va itérer 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 datant de l'époque de Java 1.1, avant que le cadre des collections n'existe. Elle ne devrait plus être utilisée, car son API est encombrée de méthodes obsolètes qui font double emploi, et ses méthodes sont synchronisées (ce qui peut diminuer les performances et est généralement inutile). Utilisez ConcurrentHashMap au lieu de Hashtable.

2 votes

Qu'est-ce qu'une carte en fait et quelle est la différence entre Map, HashMap et Hashtables.

5 votes

@theband : Map est une interface. HashMap et Hashtable l'implémentent toutes deux ; comme je l'ai écrit, Hashtable est une ancienne classe.

1 votes

@theband : Lisez la doc sur l'API, c'est à ça que ça sert : java.sun.com/javase/6/docs/api/java/util/package-summary.html

69voto

Eyal Schneider Points 11399

Tous les trois représentent le mappage de clés uniques vers des valeurs, et mettent donc en œuvre la fonction Carte interface.

  1. HashMap est une carte basée sur hachage des clés. Il supporte O(1) opérations d'entrée/sortie. Les clés doivent avoir [des implémentations cohérentes de hashCode() y equals()](http://java.sun.com/javase/6/docs/api/java/lang/Object.html#hashCode()) pour que cela fonctionne.

  2. LinkedHashMap est très similaire à HashMap, mais il tient compte de l'ordre d'ajout (ou d'accès) des éléments, de sorte que l'ordre d'itération est le même que l'ordre d'insertion (ou d'accès, selon les paramètres de construction).

  3. TreeMap est une cartographie basée sur les arbres. Ses opérations put/get prennent un temps O(log n). Il exige que les éléments aient un mécanisme de comparaison, soit avec Comparable ou Comparator. L'ordre d'itération est déterminé par ce mécanisme.

1 votes

Donc, si je comprends bien, la seule différence entre LinkedHashMap et TreeMap est la performance, étant donné que l'ordre d'insertion est le même que l'ordre naturel ?

20 votes

@MosheShaham Comme il l'a dit dans le numéro 2 : LinkedHashMap va itérer dans l'ordre d'insertion, et non dans l'ordre naturel. Ainsi, si vous ajoutez (2,5,3) à un LinkedHashMap et faire un for each dessus, il retournera 2,5,3 . Si c'était 2,5,3 à un TreeMap il retournera 2,3,5 .

2 votes

La carte des arbres comporte également de nombreuses autres astuces intéressantes. Comme les cartes de tête et de queue.

43voto

Prem Kumar Points 61

HashMap

  • Il a une paire de valeurs (clés, valeurs)
  • PAS de duplication des valeurs clés
  • non ordonné non trié
  • il permet une clé nulle et plus d'une valeur nulle.

Table de hachage

  • comme la carte de hachage
  • il n'autorise pas les clés nulles et les valeurs nulles

Cartouche de hachage

  • Il s'agit d'une version ordonnée de la mise en œuvre de la carte
  • Basé sur les listes liées et les structures de données de hachage

TreeMap

  • Version ordonnée et triée
  • basé sur des structures de données de hachage

4 votes

HashTable est également synchronisé. Quoi qu'il en soit, j'aime votre réponse, claire et nette.

38voto

Ogre Psalm33 Points 4886

Je voudrais juste ajouter quelques éléments tirés de ma propre expérience des cartes, pour savoir quand j'utiliserais chacune d'entre elles :

  • HashMap - Très utile lorsque l'on recherche une mise en œuvre plus performante (rapide).
  • TreeMap (interface SortedMap) - Très utile lorsque je souhaite pouvoir trier ou itérer sur les clés dans un ordre particulier que je définis.
  • LinkedHashMap - Combine les avantages de l'ordonnancement garanti de TreeMap sans le coût accru de la maintenance de TreeMap. (Il est presque aussi rapide que le HashMap). En particulier, le LinkedHashMap fournit également un excellent point de départ pour créer un objet Cache en surchargeant la fonction removeEldestEntry() méthode. Cela vous permet de créer un objet Cache qui peut expirer des données en fonction de certains critères que vous définissez.

10 votes

Pour être précis, TreeMap ne garde pas les éléments dans l'ordre. Il conserve les clés dans l'ordre.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X