L'API de collection Java fournit quelques classes et interfaces de colonne pour nous aider à stocker et à gérer les collections d'objets. En fait, les collections en Java fonctionnent comme un tableau, mais la taille de la collection peut être modifiée dynamiquement et les collections offrent également des fonctions plus avancées. Avec l'API Javacollection, nous n'avons pas besoin d'écrire nous-mêmes des classes de collecte. La plupart des classes de collection Java sont situées dans java.util , et certaines classes de collecte liées à la concurrence sont situées dans le package java.util.concurrent . Voici quelques-unes des classes de collecte fournies par l'API Java.
1. Aperçu des collections Java
Il existe deux catégories de collections à Java, à savoir:
1. Collection
2. Carte
La collection de la classe de collection peut être comprise comme le stockage principalement des objets uniques, tandis que la collection de la classe MAP stocke principalement des objets de valeur clé. Ces deux catégories peuvent être considérées comme acquises pour correspondre à deux interfaces, à savoir Collection接口et Map接口. L'image suivante répertorie l'arbre successif de ces deux interfaces:
D'après l'image ci-dessus, nous pouvons voir que l'interface de collection a dérivé trois branches, à savoir:
1. Liste
2. Set
3. Fitre
La carte est relativement simple, avec une seule branche. Ci-dessous, nous présenterons chaque classe d'implémentation de la collection Java en détail.
Remarque: Pour distinguer la collecte et les collections, les collections sont une interface de la collection, et les collections sont une classe d'outils, qui fournit des méthodes statiques pour nous faciliter les instances de collecte, qui sont toutes deux situées dans le package java.util .
2. Introduire d'abord de l'interface de collection
La figure suivante est une capture d'écran du code source de l'interface de collecte. D'après les méthodes abstraites de l'interface, nous pouvons voir qu'il définit une méthode commune pour une collection générale:
- Ajouter et supprimer un élément
- Déterminez si l'élément existe
- Obtenez la taille de la collection
- itérer sur une collection
2.1 Interface de liste de la collection
L'interface de liste hérite de l'interface de collection. Sa caractéristique est que les objets qui s'y trouvent sont commandés et que chaque objet a un index unique. Nous pouvons rechercher un élément via cet index, et les objets de la liste peuvent être répétés, ce qui est similaire à un tableau. Pour l'interface de liste, l'API Java fournit l'implémentation suivante:
- java.util.arraylist
- java.util.linkedlist
- java.util.vector
- java.util.stack
Bien sûr, il existe des implémentations dans le package java.util.concurrent , qui sera décrit en détail dans un autre article.
ArrayList est la collection la plus couramment utilisée, et son implémentation interne est un tableau , et la taille de ArrayList peut être élargie dynamiquement. L'efficacité d'accès aléatoire pour les éléments est élevée et la complexité temporelle de l'accès est O(1) . L'efficacité de fonctionnement de la queue est élevée et la complexité du temps est O(1) tout comme un accès aléatoire. S'il est opéré à partir de la tête, l'efficacité sera relativement faible, car lors de l'insertion ou de la suppression de la tête, tous les éléments suivants doivent être déplacés et la complexité du temps est O(ni) (n représente le nombre d'éléments, et je représente la position de l'élément).
LinkList: Comme on peut le voir sur la figure ci-dessus, il hérite non seulement de l'interface List , mais hérite également de l'interface Deque (elle sera introduite plus tard). LinkList est une structure de données basée sur une liste liée, et chaque nœud enregistre les pointeurs vers les nœuds précédents et suivants. LinkList est relativement inefficace pour un accès aléatoire car il nécessite l'indexation à partir de zéro, donc sa complexité temporelle est O(i) . Cependant, pour l'addition et la suppression des éléments, LinkList est efficace car seuls les pointeurs avant et arrière doivent être modifiés et sa complexité temporelle est O(1) .
Vector: D'après les captures d'écran du code source Vector et ArrayList, ils héritent des interfaces exactement de la même manière. Par conséquent, le vecteur peut être considéré comme une liste Array-SAFE, qui est également implémentée en fonction des tableaux , mais presque toutes les opérations de collecte sont ajoutées avec le mot-clé synchronized .
Stack: Ce qui précède est une capture d'écran du code source de la classe de pile. Nous voyons que la classe de pile hérite réellement de Vector. Stack ajoute juste plusieurs méthodes basées sur Vector pour fournir les caractéristiques de la pile (dernier dans First Out LifO). La fonctionnalité de Stack est que lorsqu'elle est ajoutée, de nouveaux éléments seront ajoutés en haut, et lorsqu'ils sont supprimés, les éléments supérieurs seront supprimés en premier. Cette structure de données est principalement utilisée comme certains processus de traitement des données spéciaux, tels que la compilation du langage, l'analyse XML, etc.
2.2 Interface de set de collection
Les interfaces set et lister sont également héritées de l'interface Collection et sont également une implémentation de collections. La plus grande différence entre eux est que les objets dans l'ensemble ne peuvent pas être répétés . Pour les interfaces Set , l'API Java fournit la mise en œuvre suivante:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- java.util.treeset
Les fonctions de ces classes sont légèrement différentes, et les différences se reflètent principalement dans l'ordre de l'itération des objets et l'efficacité de l'insertion et de la recherche.
La mise en œuvre de Hashset est très simple, et c'est un HashMap à l'intérieur, mais il ne garantit pas l'ordre des éléments.
L'implémentation de LinkedHashSet est également très simple et utilise un LinkedHashMap en interne. Étant donné que LinkedHashMap maintient une liste liée bidirectionnelle en interne pour maintenir l'ordre, la caractéristique de LinkedHashSet est que les éléments qu'il contient sont ordonnés et que l'ordre de l'itération des éléments est l'ordre de leur insertion. La réinsertion des éléments n'affectera pas l'ordre des éléments d'origine.
Treeset: D'après la relation d'héritage dans la figure ci-dessus, vous devez d'abord comprendre NavigableSet TreeSet SortedSet .
Interface de tri
Interface publique tridSet <e> étend Set <e> {Comparator <? super e> comparateur (); Sous-ensemble SORDSET <E> (E FromElement, E Toelement); Casque tridSet <e> (e Toelement); Tailset SORDSET <E> (E FromElement); E First (); } À partir de la définition de l'interface ci-dessus, l'interface tridset est un sous-interface de l'ensemble. En plus des caractéristiques générales de l'ensemble, ses éléments sont commandés en interne. L'ordre des éléments internes dépend des règles de commande des éléments, c'est-à-dire que l'ordre des éléments dépend de la mise en œuvre de l'interface comparable de l'élément ou d'un comparator de comparaison. Pour la différence entre comparable et comparateur, veuillez vous référer à: https://www.vevb.com/article/93973.htm
Interface NavigableSet
Interface publique NavigableSet <E> étend triSetSet <e> {NavigableSet <e> descendingSet (); Iterator <e> descendingiterator (); Casque tridSet <e> (e Toelement); Tailset SORDSET <E> (E FromElement); Sous-ensemble SORDSET <E> (E FromElement, E Toelement); plafond (), plancher (), supérieur () et inférieur () ...}À partir de la définition de l'interface NavigableSet, il s'agit d'un sous-interface de SORNSET et fournit quelques méthodes de navigation. Quant au sens de ces méthodes de navigation, vous pouvez vérifier Java Doc.
Par conséquent, la caractéristique de Treeset est que ses éléments internes sont commandés et qu'il existe de nombreuses méthodes de navigation à mettre en œuvre. À partir de la première partie de la vue d'ensemble de la classe de collection Java, nous savons que Set a un sous-interface SortedSet , et TridSet a une interface NavigableSet sous-interface. L'API Java implémente uniquement les interfaces tridset et NavigableSet, qui est TreeSet .
2.3 Interface de file d'attente de la collection
L'interface de file d'attente hérite de l'interface Collection , qui représente également une file d'attente ordonnée. Cependant, la plus grande caractéristique de cette file d'attente est que l'élément nouvellement inséré est situé à la queue de la file d'attente et que l'objet supprimé est situé à la tête de la file d'attente, qui est similaire à la file d'attente qui vérifie le supermarché.
Nous savons déjà à partir de la vue d'ensemble de la collection Java dans la section 1 que l'interface de file d'attente a également un désir de sous-interface. Jetons un coup d'œil à la définition de ces deux interfaces par l'API Java:
Interface de file d'attente:
La file d'attente d'interface publique <E> étend la collection <e> {boolean add (e e); Offre booléenne (e e); E relève (); E poll (); E peek ();}Interface DEQI:
Interface publique Deque <E> étend la file d'attente <e> {void addFirst (e e); void addlast (e e); E retireFirst (); E retireFirst ();}D'après les définitions de ces deux interfaces, je pense que tout le monde a vu des indices. L'interface de file d'attente définit la méthode de fonctionnement d'une file d'attente générale, tandis que Deque est une file d'attente à double extrémité .
Pour les interfaces Queue , l'API Java fournit deux implémentations:
- java.util.linkedlist (implémente également l'interface DEQI)
- java.util.priorityqueue
LinkedList: Le chapitre de la liste précédente a mentionné qu'il s'agissait d'une file d'attente standard.
PriorityQueue: L'ordre dans la file d'attente est similaire à Treeset, selon les règles de commande des éléments, c'est-à-dire la mise en œuvre des éléments à l'interface comparable ou à un comparateur de comparaison.
Pour l'interface DEQI, il y a une autre implémentation en plus de la classe LinkList:
- java.util.arraydeque
ArrayDeque: Comme on peut le voir à partir du nom, son implémentation interne est un tableau.
3. Carte de la collection Java
Depuis la première partie de la vue d'ensemble de la classe de collection Java, nous savons que MAP n'hérite pas de l'interface de collection, mais est située dans une position parallèle avec l'interface de collection. Par conséquent, le comportement de la carte est très différent du comportement de la collection introduit ci-dessus. La principale caractéristique de la carte est que les éléments qu'il stocke sont des paires key-value . Jetons un coup d'œil à la définition de l'interface de carte:
Map d'interface publique <k, v> {v put (key k, vale v); Boolean contientKey (clé d'objet); Set <map.entry <k, v >> entryset (); int hashcode (); V get (clé objet); Set <K> keySet (); ...}Pour les interfaces MAP, l'API Java fournit les implémentations suivantes:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- java.util.identityhashmap
- java.util.linkedhashmap
- java.util.properties
- java.util.treemap
- java.util.weakhashmap
Parmi eux, les plus couramment utilisés sont Hashmap et Treemap.
La clé et la valeur de Hashmap sont toutes deux désordonnées. La mise en œuvre interne de HashMap mérite d'être étudiée. Pour plus de détails, veuillez vous référer à l'implémentation interne de Hashmap
Le hashtable peut être considéré comme une mise en œuvre des poids lourds de HashMap. La plupart des méthodes sont ajoutées avec le mot-clé synchronisé, qui est en filetage. Une autre différence entre HashTable et le hashmap est que les deux key-value de HashMap sont autorisées à être nuls, tandis que HashTable不.
LinkedHashMap est également un hashmap, mais une liste liée bidirectionnelle est maintenue en interne pour maintenir la commande. L'implémentation interne LinkedHashSet est utilisée pour utiliser LinkedHashmap.
La clé et la valeur de Treemap peuvent non seulement maintenir l'ordre, mais sont similaires à TreeSet et PriorityQueue . L'ordre itératif de la clé et de la valeur en Treemap dépend de leurs règles de tri respectives.
Ce qui précède est tout le contenu de cet article. J'espère que cela sera utile à l'apprentissage de tous et j'espère que tout le monde soutiendra davantage Wulin.com.