Die Java Collection API bietet einige Spaltenklassen und Schnittstellen, mit denen wir Objektsammlungen speichern und verwalten können. Tatsächlich funktionieren Sammlungen in Java wie ein Array, aber die Größe der Sammlung kann dynamisch geändert werden, und Sammlungen bieten auch fortgeschrittenere Funktionen. Mit der Javacollection -API müssen wir selbst keine Sammelkurse schreiben. Die meisten Java-Sammlungskurse befinden sich im java.util Paket, und einige gleichzeitig bezogene Sammlungsklassen befinden sich im Paket java.util.concurrent . Hier sind einige der von der Java -API bereitgestellten Sammelklassen.
1. Überblick über Java -Sammlungen
Es gibt zwei Kategorien von Sammlungen in Java, nämlich:
1. Sammlung
2. Karte
Die Sammlung der Sammlungsklasse kann als hauptsächlich einzelne Objekte gespeichert werden, während die Sammlung der Kartenklasse hauptsächlich Schlüsselwertobjekte speichert. Diese beiden Kategorien können als selbstverständlich angenommen werden, um zwei Schnittstellen zu entsprechen, nämlich Collection接口und Map接口. Das folgende Bild listet den Vererbungsbaum dieser beiden Schnittstellen auf:
Aus dem obigen Bild können wir sehen, dass die Sammlungsschnittstelle drei Zweige abgeleitet hat, nämlich:
1. Liste
2. Set
3. Warteschlange
Die Karte ist relativ einfach, mit nur einem Zweig. Im Folgenden werden wir jede Implementierungsklasse der Java -Sammlung im Detail vorstellen.
Hinweis: Um Sammeln und Sammlungen zu unterscheiden, ist Sammlungen eine Schnittstelle zur Sammlung, und Sammlungen ist eine Werkzeugklasse, die einige statische Methoden bietet, mit denen wir Sammelinstanzen betreiben können, die sich beide im java.util -Paket befinden.
2. Einführen Sie zuerst aus der Sammlungsschnittstelle
Die folgende Abbildung ist ein Screenshot des Quellcodes der Sammlungsschnittstelle. Aus den abstrakten Methoden in der Schnittstelle können wir feststellen, dass sie eine gemeinsame Methode für eine allgemeine Sammlung definiert:
- Fügen Sie ein Element hinzu und löschen Sie
- Bestimmen Sie, ob das Element existiert
- Erhalten Sie die Größe der Sammlung
- Über eine Sammlung iterieren
2.1 Kollektionslistenschnittstelle
Die List -Schnittstelle erbt von der Sammlungsschnittstelle. Sein Merkmal ist, dass die darin enthaltenen Objekte geordnet sind und jedes Objekt einen eindeutigen Index hat. Wir können über diesen Index nach einem Element suchen, und die Objekte in der Liste dürfen wiederholt werden, was einem Array ähnlich ist. Für die List -Schnittstelle bietet die Java -API die folgende Implementierung:
- Java.util.ArrayList
- java.util.linkedList
- Java.util.Vector
- java.util.stack
Natürlich gibt es einige Implementierungen im java.util.concurrent -Paket, die in einem anderen Artikel ausführlich beschrieben werden.
ArrayList ist die am häufigsten verwendete Sammlung, und seine interne Implementierung ist ein Array , und die Größe der ArrayList kann dynamisch erweitert werden. Die Zufallszugriffseffizienz für Elemente ist hoch und die zeitliche Komplexität des Zugangs ist O(1) . Die Betriebseffizienz des Schwanzes ist hoch und die zeitliche Komplexität ist O(1) genau wie der Zufallszugriff. Wenn es aus dem Kopf betrieben wird, ist die Effizienz relativ niedrig, da beim Einfügen oder Löschen vom Kopf alle folgenden Elemente bewegt werden müssen und die Zeitkomplexität O(ni) ist (N repräsentiert die Anzahl der Elemente, und I repräsentiert die Position des Elements).
LinkList: Wie aus der obigen Abbildung hervorgeht, erbt es nicht nur die List , sondern erbt auch die Deque -Schnittstelle (sie wird später eingeführt). LinkList ist eine Datenstruktur, die auf einer verknüpften Liste basiert, und jeder Knoten spart Zeiger für die vorherigen und nächsten Knoten. LinkList ist für den Zufallszugriff relativ ineffizient, da die Indexierung von Grund auf neu ist, sodass seine Zeitkomplexität O(i) ist. Für die Hinzufügung und Löschung von Elementen ist LinkList jedoch effizient, da nur die Vorder- und Rückzeiger modifiziert werden müssen und seine Zeitkomplexität O(1) ist.
Vektor: Aus den Screenshots des Vektor- und ArrayList -Quellcodes erben sie die Schnittstellen genau gleich. Daher kann Vektor als thread-sicherer Arraylist angesehen werden, der auch basierend auf Arrays implementiert wird , aber fast alle Sammlungsvorgänge werden mit dem synchronized Schlüsselwort hinzugefügt.
Stack: Das obige ist ein Screenshot des Stack Class -Quellcodes. Wir sehen, dass die Stack -Klasse tatsächlich von Vector ererbt. Stack fügt nur mehrere Methoden hinzu, die auf Vektor basieren, um die Eigenschaften des Stacks (zuletzt in der ersten Out LIFO) bereitzustellen. Die Funktion von Stack ist, dass bei Hinzufügen neue Elemente nach oben hinzugefügt werden, und wenn sie entfernt werden, werden die Top -Elemente zuerst entfernt. Diese Datenstruktur wird hauptsächlich als spezielle Datenverarbeitungsprozesse wie Sprachkompilierung, XML -Parsing usw. verwendet.
2.2 Collection Set Interface
SET- und Listen -Schnittstellen werden auch von der Collection vererbt und sind auch eine Implementierung von Sammlungen. Der größte Unterschied zwischen ihnen besteht darin, dass Objekte im SET nicht wiederholt werden dürfen . Für Set Schnittstellen liefert die Java -API die folgende Implementierung:
- java.util.enumset
- java.util.hashset
- java.util.linkedhashset
- Java.util.Treeset
Die Funktionen dieser Klassen sind geringfügig unterschiedlich, und die Unterschiede spiegeln sich hauptsächlich in der Reihenfolge der Iteration von Objekten und der Effizienz von Insertion und Suche wider.
Die Implementierung von Hashset ist sehr einfach und ist ein HashMap im Inneren, aber es garantiert nicht die Reihenfolge der Elemente.
Die Implementierung von LinkedHashset ist ebenfalls sehr einfach und verwendet intern eine LinkedHashMap . Da LinkedHashMap eine bidirektionale verlinkte Liste intern beibehält, um die Reihenfolge aufrechtzuerhalten, ist das Merkmal von LinkedHashSet , dass die darin enthaltenen Elemente geordnet sind und die Reihenfolge der Element -Iteration die Reihenfolge ihrer Einfügung ist. Die Wiedereinspeisung von Elementen wirkt sich nicht auf die Reihenfolge der ursprünglichen Elemente aus.
Treeset: Aus der Erbschaftsbeziehung in der obigen Abbildung müssen Sie zunächst NavigableSet TreeSet SortedSet -Schnittstellen verstehen.
SortedSet -Schnittstelle
public interface sortEdSet <e> erweitert set <e> {vergleicher <? Super e> vergleicher (); SortEdSet <e> subset (e fromELement, e toelement); SortEdSet <e> Headset (e Toelement); SortEdSet <e> mailet (e fromELement); E First (); } Aus der obigen Schnittstellendefinition ist die sortEdSet -Schnittstelle eine Subinterspektion des Satzes. Zusätzlich zu den allgemeinen Set -Eigenschaften werden seine Elemente intern bestellt. Die Reihenfolge interner Elemente hängt von den Bestellregeln der Elemente ab, dh der Reihenfolge der Elemente hängt von der Implementierung der comparable Schnittstelle des Elements oder eines comparator ab. Die Differenz zwischen vergleichbarem und Vergleicher finden Sie unter: https://www.vevb.com/article/93973.htm
Navigableset -Schnittstelle
public interface navigableSet <e> erweitert sortEdSet <E> {Navigableset <E> desceinset (); Iterator <E> DEMSCINTERTIERTIERER (); SortEdSet <e> Headset (e Toelement); SortEdSet <e> mailet (e fromELement); SortEdSet <e> subset (e fromELement, e toelement); Decke (), floor (), höher () und lower () ...}Aus der Definition der NavigableSet -Schnittstelle handelt es sich um eine Sortenset -Subinterface und bietet einige Navigationsmethoden. In Bezug auf die Bedeutung dieser Navigationsmethoden können Sie Java Doc überprüfen.
Daher ist das Merkmal von Treeset, dass seine internen Elemente geordnet werden und es viele Navigationsmethoden zur Implementierung gibt. Aus dem ersten Teil der Übersicht über die Java-Sammlungsklasse wissen wir, dass das SET ein SortedSet unter der Untergrenze und SortEDSet über eine NavigableSet -Schnittstelle von SortEdSet verfügt. Die Java -API implementiert nur SortEdSet- und Navigableset -Schnittstellen, das TreeSet ist.
2.3 Warteschlangenschnittstelle der Sammlung
Die Warteschlangenschnittstelle erbt von der Collection , die auch eine geordnete Warteschlange darstellt. Das größte Merkmal dieser Warteschlange besteht jedoch darin, dass sich das neu eingefügte Element am Schwanz der Warteschlange befindet und sich das entfernte Objekt am Kopf der Warteschlange befindet, die der Warteschlange ähnelt, die im Supermarkt auscheckt.
Wir wissen bereits aus dem Überblick über die Java-Sammlung in Abschnitt 1, dass die Warteschlangenschnittstelle auch über eine Untergrenzung verfügt. Schauen wir uns die Definition dieser beiden Schnittstellen durch die Java -API an:
Warteschlangenschnittstelle:
Öffentliche Schnittstelle Warteschlange <E> erweitert die Sammlung <e> {boolean add (e e); Boolean Angebot (e e); E entfernen (); E Umfrage (); E peek ();}Deque -Schnittstelle:
public interface deque <e> erweitert die Warteschlange <e> {void addfirst (e e); void addlast (e e); E removeFirst (); E removeFirst ();}Aus den Definitionen dieser beiden Schnittstellen denke ich, dass jeder einige Hinweise gesehen hat. Die Warteschlangenschnittstelle definiert die Betriebsmethode einer allgemeinen Warteschlange, während Deque eine Doppel-Warteschlange ist.
Für Queue enthält die Java -API zwei Implementierungen:
- java.util.linkedList (implementiert auch die Deque -Schnittstelle)
- Java.util.Priorityqueue
LinkedList: In dem Kapitel "Vorherige Liste" wird erwähnt, dass es sich um eine Standardwarteschlange handelt.
PriorityQueue: Die Reihenfolge in der Warteschlange ähnelt dem Treeset, abhängig von den Bestellregeln der Elemente, dh der Implementierung der Elemente an die vergleichbare Schnittstelle oder einen Komparatorvergleich.
Für die Deque -Schnittstelle gibt es eine weitere Implementierung neben der LinkList -Klasse:
- Java.util.Arraydeque
Arraydeque: Wie aus dem Namen ersichtlich ist, ist seine interne Implementierung ein Array.
3. Java -Sammlungskarte
Aus dem ersten Teil der Übersicht über die Java -Sammlungsklasse wissen wir, dass MAP nicht von der Sammlungsschnittstelle erbt, sondern sich in einer parallelen Position mit der Sammelschnittstelle befindet. Daher unterscheidet sich das Verhalten von MAP stark vom oben eingeführten Verhalten der Sammlung. Die Hauptmerkmal der Karte ist, dass die Elemente, die es speichert key-value sind. Schauen wir uns die Definition der Kartenschnittstelle an:
public interface map <k, v> {v put (k key, v value); boolean enthälty (Objektschlüssel); Set <map.Entry <k, v >> EinstiegSet (); int HashCode (); V GET (Objektschlüssel); Set <k> keyset (); ...}Für Kartenschnittstellen enthält die Java -API die folgenden Implementierungen:
- java.util.hashmap
- java.util.hashtable
- java.util.enummap
- Java.util.identityHasMap
- java.util.linkedhashMap
- Java.util.Properties
- Java.util.Treemap
- Java.util.WeakhashMap
Unter ihnen sind die am häufigsten verwendeten Hashmap und Treemap.
Der Schlüssel und der Wert in HashMap sind beide ungeordnet. Die interne Implementierung von HashMap lohnt sich zu studieren. Weitere Informationen finden Sie in der internen Implementierung von HashMap
Hashtable kann als eine Schwergewichtsumsetzung von HashMap angesehen werden. Die meisten Methoden werden mit dem synchronisierten Schlüsselwort hinzugefügt, das Thread-Safe ist. Ein weiterer Unterschied zwischen HashTable und HashMap besteht darin, dass beide key-value von Hashmap null sein dürfen, während HashTable不.
LinkedHasMap ist ebenfalls eine HashMap, aber eine mit zwei Wege verknüpfte Liste wird intern gepflegt, um die Reihenfolge aufrechtzuerhalten. Die interne Implementierung LinkedHashSet wird verwendet, um LinkedHashMap zu verwenden.
Der Schlüssel und der Wert in Treemap können nicht nur die Reihenfolge aufrechterhalten, sondern ähneln TreeSet und PriorityQueue . Die iterative Reihenfolge von Schlüssel und Wert in Treemap hängt von ihren jeweiligen Sortierregeln ab.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.