Quelle collection Java dois-je utiliser?
dans cette question Comment puis-je sélectionner efficacement un conteneur de bibliothèque Standard en C++11? est un organigramme pratique à utiliser lors du choix des collections C++.
j'ai pensé que c'était une ressource utile pour les gens qui ne sont pas sûrs de la collection qu'ils devraient utiliser, donc j'ai essayé de trouver un organigramme similaire pour Java et n'a pas été en mesure de le faire.
quelles ressources et "feuilles de tricherie" sont disponibles pour aider les gens à choisir droit de collecte à utiliser lors de la programmation en Java? Comment les gens savent-ils quelles implémentations List, Set et Map ils devraient utiliser?
4 réponses
comme je n'ai pas pu trouver un organigramme similaire, j'ai décidé d'en faire un moi-même.
ce diagramme n'essaie pas de couvrir des choses comme l'accès synchronisé, la sécurité du fil, etc ou les collections héritées, mais il couvre les 3 standards Set s, 3 standard Map s et 2 standard List s.
cette image a été créé pour cette réponse et est sous licence sous licence internationale Creative Commons Attribution 4.0. l'attribution la plus simple est d'établir un lien avec cette question ou cette réponse.
autres ressources
probablement L'autre référence la plus utile est la page suivante de la documentation d'oracle qui décrit chaque Collection .
HashSet vs TreeSet
il y a une discussion détaillée sur le moment d'utiliser HashSet
ou TreeSet
ici:
Hashset vs Treeset
ArrayList vs LinkedList
discussion détaillée: quand utiliser LinkedList over ArrayList?
Résumé des principales non-simultanées, non synchronisée collections
Collection
: une interface représentant un "sac" d'articles, appelé "elements". L'élément "suivant" n'est pas défini (aléatoire).
-
Set
: une interface représentant unCollection
sans duplicata.-
HashSet
: unSet
soutenu par unHashtable
. Utilisation de la mémoire la plus rapide et la plus petite, lors de la commande est sans importance. -
LinkedHashSet
: AHashSet
avec l'ajout d'une liste liée aux éléments associés dans ordre d'insertion . Le "prochain", constitue l'élément suivant-plus récemment inséré élément. -
TreeSet
: unSet
où les éléments sont ordonnés par unComparator
(typiquement commande naturelle ). L'utilisation de mémoire la plus lente et la plus grande, mais nécessaire pour la commande basée sur un comparateur. -
EnumSet
: unSet
extrêmement rapide et efficace personnalisé pour un type enum simple.
-
-
List
: une interface représentant unCollection
dont les éléments sont ordonnés et ont chacun un index numérique représentant sa position, où Zéro est le premier élément, et(length - 1)
est le dernier.-
ArrayList
: unList
soutenu par un tableau, où le tableau a un longueur (appelé "capacité") qui est au moins aussi grand que le nombre d'éléments (la liste de la "taille"). Lorsque la taille dépasse la capacité (lorsque l'élément(capacity + 1)-th
est ajouté), le tableau est recréé avec une nouvelle capacité de(new length * 1.5)
--cette récréation est rapide, car il utiliseSystem.arrayCopy()
. Supprimer et insérer / ajouter des éléments nécessite que tous les éléments voisins (à droite) soient déplacés dans ou hors de cet espace. L'accès à n'importe quel élément est rapide, car il ne nécessite calcul(element-zero-address + desired-index * element-size)
pour trouver son emplacement. dans la plupart des cas , unArrayList
est préféré à unLinkedList
. -
LinkedList
: unList
soutenu par un ensemble d'objets, chacun lié à ses voisins" précédents "et" suivants". UnLinkedList
est aussi unQueue
etDeque
. L'accès aux éléments se fait à partir du Premier ou du dernier élément, et en traversant jusqu'à ce que l'indice désiré est atteint. Insertion et suppression, une fois que l'index désiré est atteint par l'intermédiaire de la traversée est une question triviale de re-mappage seulement les liens de voisinage immédiat pour pointer vers le nouvel élément ou contourner l'élément maintenant supprimé.
-
-
Map
: une interface représentant unCollection
où chaque élément a une"clé" d'identification--chaque élément est une paire clé-valeur.-
HashMap
: unMap
où les clés ne sont pas ordonnées, et sont appuyées par unHashtable
. -
LinkedhashMap
: les clés sont commandées par "ordre d'insertion . -
TreeMap
: unMap
où les clés sont commandé par unComparator
(généralement commande naturelle).
-
-
Queue
: une interface qui représente unCollection
où les éléments sont typiquement ajoutés à une extrémité et retirés de l'autre (FIFO: first-in, first-out). -
Stack
: une interface qui représente unCollection
où les éléments sont, typiquement, à la fois ajoutés (poussés) et retirés (sautés) de la même extrémité (LIFO: last-in, first-out). -
Deque
: abréviation de" file d'attente double extrémité", habituellement prononcé"deck". Une liste, qui est généralement ajoutée et de lire de part et d'autre (pas au milieu).
Schémas de collection de base:
comparant l'insertion d'un élément avec un ArrayList
et LinkedList
:
voici une image encore plus simple. Intentionnellement simplifié!
-
Collection est tout ce qui contient des données appelées" éléments " (du même type). Rien de plus précis qui est utilisé.
-
liste est un indexé recueil de données où chaque élément a un index. Quelque chose comme la matrice, mais plus souple.
données dans la liste garder l'ordre d'insertion.
-
Set est un sac d'éléments , chaque élément une seule fois (les éléments sont distingués en utilisant leur méthode
equals()
.les données dans l'ensemble sont stockées principalement juste pour savoir ce que données sont là.
-
carte est quelque chose comme la liste, mais au lieu d'accéder aux éléments par leur index entier, vous y accédez par leur clé , qui est tout objet. Comme le tableau en PHP:)
Données de la carte sont consultables par leur clé.
Le principal la différence entre le Jeu et la Carte est que, dans l'Ensemble, vous recherche données par eux-mêmes , tandis que dans la carte par leur clé .
c'est simple: si vous avez besoin de stocker des valeurs avec des clés qui leur sont associées, allez pour l'interface Map, sinon utilisez List pour les valeurs qui peuvent être dupliquées et finalement utilisez L'interface Set si vous ne voulez pas de valeurs dupliquées dans votre collection.
Voici l'explication complète http://javatutorial.net/choose-the-right-java-collection , y compris organigramme etc