Les collections Java sont grossièrement divisées en quatre systèmes : Set, List, Queue et Map
Parmi eux, Set représente une collection non ordonnée et non répétable ; List représente une collection ordonnée et répétitive ; Map représente un mappage. Une collection de relations ; Queue est l'implémentation d'une file d'attente.
Les collections sont différentes des tableaux. Les éléments du tableau peuvent être soit des valeurs de type de base, soit des objets (en fait, ils enregistrent les variables de référence des objets). Les collections ne peuvent stocker que des objets (en fait, elles stockent uniquement des variables de référence). ).
Il existe deux interfaces dérivées dans les collections Java : Collection et Map
Arbre d'héritage du système de collection Collection :
Arbre d'héritage du système de collection Map :
Ce qui suit décrit la
Collection Set :
La collection Set est similaire à un jar, le programme Vous pouvez y "lancer" plusieurs objets dans l'ordre. Set ne se souviendra pas de l'ordre dans lequel les éléments sont ajoutés et les collections Set n'autorisent pas les mêmes éléments.
HashSet :
Caractéristiques :
L'ordre des éléments n'est pas garanti
HashSet n'est pas synchronisé
La valeur de l'élément définie peut être nulle
La norme permettant à HashSet de déterminer l'égalité de deux éléments est la suivante : Les deux objets sont comparés égaux via la méthode equals(), et les valeurs de retour de la méthode hashcode() des deux objets sont également égales .
Remarque : lorsque vous placez un objet dans un HashSet, si vous devez remplacer la méthode equals() de l'objet, vous devez remplacer sa méthode hashCode(). La règle est la suivante : si deux objets sont comparés et renvoient true via la méthode equals(), les valeurs hashCode des deux objets doivent être les mêmes.
LinkedSet :
LinkedSet détermine l'emplacement de stockage des éléments en fonction de la valeur hashCode d'origine, mais il utilise également une liste chaînée pour maintenir l'ordre des éléments , afin que les éléments L'ordre d'insertion soit conservé. LinkedSet accède aux éléments de l'ensemble dans l'ordre dans lequel ils sont ajoutés.
LinkedSet doit maintenir la position d'insertion des éléments, les performances seront donc légèrement inférieures à celles de HashSet.
TreeSet :
TreeSet garantit que les éléments de la collection sont dans un état trié.
TreeSet n'est pas trié selon l'ordre d'insertion des éléments, mais selon la valeur réelle des éléments.
TreeSet utilise la structure de données arborescente rouge-noir pour stocker les éléments de l'ensemble.
TreeSet prend en charge deux méthodes de tri : le tri naturel et le tri personnalisé. Par défaut, TreeSet utilise l'ordre naturel.
Tri naturel : TreeSet appellera la méthode compareTo (Object obj) des éléments de la collection pour comparer la relation de taille entre les éléments, puis organisera les éléments de la collection par ordre croissant. Par défaut, TreeSet utilise l'ordre naturel.
Lorsqu'un objet est ajouté à la collection TreeSet, TreeSet appelle la méthode compareTo (Object obj) de l'objet pour comparer la taille avec d'autres objets dans le conteneur, puis trouve son emplacement de stockage en fonction de l'arborescence rouge-noir .
Le seul critère pour juger si deux objets sont égaux est : Si la comparaison de deux objets via la méthode compareTo (Object obj) renvoie 0.
Si la comparaison de deux objets via la méthode equals() renvoie true, la comparaison des deux objets via la méthode compareTo(Object obj) devrait renvoyer 0.
Tri personnalisé : Si vous devez implémenter un tri personnalisé, vous devez fournir un objet Comparator associé à la collection TreeSet lorsque vous créez l'objet de collection TreeSet. L'objet Comparator est responsable de la logique de tri des éléments de la collection. .
EnumSet :
Les éléments de collection d'EnumSet sont également ordonnés. EnumSet détermine l'ordre des éléments de collection en fonction de l'ordre de positionnement des valeurs d'énumération au sein de la classe Enum.
EnumSet est stocké en interne sous forme de vecteurs de bits.
La collection EnumSet ne permet pas d'ajouter des éléments nuls.
Analyse des performances de chaque classe d'implémentation Set :
Les performances de HashSet sont toujours meilleures que celles de TreeSet, car TreeSet nécessite un algorithme d'arbre rouge-noir supplémentaire pour maintenir l'ordre de l'ensemble.
LinkedSet Pour les opérations d'insertion et de suppression ordinaires, LinkedSet est légèrement plus lent que HashSet. Cela est dû à la surcharge supplémentaire causée par la maintenance de la liste chaînée. Mais grâce à la liste chaînée, la traversée du LinkedSet est plus rapide.
EnumSet a les meilleures performances, mais il ne peut enregistrer que les valeurs d'énumération de la même classe d'énumération que les éléments de l'ensemble.
Liste :
La liste représente une combinaison ordonnée et répétable d'éléments. Chaque élément de l'ensemble a un index séquentiel correspondant.
La collection List peut accéder aux éléments de la collection en fonction de l'index de position, donc la liste peut être parcourue à l'aide de la boucle for.
ArrayList, LinkedList et Vector
Analyse du code source d'ArrayList :
Analyse du code source de LinkedList :
File d'attente :
La file d'attente est utilisée. Elle est utilisée pour simuler la structure des données de la file d'attente.
PriorityQueue :
L'ordre dans lequel les éléments de la file d'attente sont enregistrés par PriorityQueue n'est pas dans l'ordre de jointure, mais en fonction de la taille des éléments de la file d'attente.
PriorityQueue n'autorise pas l'insertion d'éléments nuls.
Deque :
L'interface Deque est une sous-interface de l'interface Queue, qui représente une file d'attente à double extrémité.
Lorsqu'une structure de données telle qu'une "pile" doit être utilisée dans un programme, il est recommandé d'utiliser ArrayDeque.
Analyse des performances de diverses tables linéaires :
1 Si vous devez parcourir des éléments de la collection List, pour les collections ArrayList et Vector, vous devez utiliser la méthode d'accès aléatoire (get) pour parcourir la collection. éléments, afin que les performances soient meilleures ; pour les collections LinkedList, vous devez utiliser un itérateur pour parcourir les éléments de la collection.
2. Si vous devez effectuer fréquemment des insertions et des suppressions, LinkedList doit être utilisé.
3. Si plusieurs threads accèdent aux éléments de la collection List en même temps, Collections doit être utilisé pour envelopper la collection dans une collection thread-safe.
Map :
Les clés de carte ne peuvent pas être répétées, c'est-à-dire que deux clés du même objet Map renverront toujours false par rapport à la méthode égale.
Il existe une méthode keySet() dans Map, qui est utilisée pour renvoyer un ensemble composé de toutes les clés de la Map.
HashMap, Hashtable :
La différence entre HashMap et Hashtable :
1 Hashtable est une carte thread-safe, HashMap n'est pas thread-safe, donc HashMap a. de meilleures performances.
2.Hashtable n'autorise pas l'utilisation de null comme clé et valeur, et HashMap autorise l'utilisation de null comme clé ou valeur.
Le critère pour juger de l'égalité de deux clés dans Hashtable et HashMap est le suivant : la méthode equals() des deux clés renvoie true, et les valeurs HashCode des deux clés sont les mêmes que le critère pour ; juger de l'égalité de deux valeurs est que la méthode equals() de la valeur ) renvoie la même valeur.
LinkedMap :
LinkedMap se souviendra de l'ordre dans lequel la valeur-clé est ajoutée.
TreeMap :
TreeMap utilise également une structure arborescente rouge-noir. La norme pour juger de l'égalité de deux clés dans TreeMap est :
Deux clés passent le compareTo(). méthode La valeur de retour est 0. (Sous tri naturel)
La valeur de retour des deux clés via la méthode compareTo() est 0. En même temps, la méthode equals() renvoie true. (Sous tri personnalisé).
EnumMap :
EnumMap est enregistré en interne sous la forme d'un tableau.
EnumMap n'autorise pas null comme clé, mais permet à la valeur d'être nulle.
Analyse des performances de la carte :
Les performances de HashMap sont meilleures que celles de Hashtable.
Les paires clé-valeur dans TreeMap sont toujours dans un état ordonné et aucune opération de tri spéciale n'est requise.
Pour les scénarios d'application généraux, envisagez d'utiliser HashMap.
LinkedMap est plus lent que HashMap car il doit maintenir une liste chaînée pour maintenir l'ordre d'ajout de clé-valeur.
EnumMap a les meilleures performances, mais il ne peut utiliser que les valeurs d'énumération de la même classe d'énumération comme clés.
Recommandations associées :
Méthodes de parcours de la collection Java Set, List, Map
Un morceau de code pour comprendre Utilisation Java de la liste, de l'ensemble et de la carte
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!