Beim Schreiben von Java-Programmen verwenden wir zusätzlich zu den acht grundlegenden Datentypen und String-Objekten am häufigsten eine Sammlungsklasse. Sammlungsklassen gibt es überall in unseren Programmen! Es gibt so viele Mitglieder der Sammlungsfamilie in Java, einschließlich der häufig verwendeten ArrayList, HashMap und HashSet sowie der weniger häufig verwendeten Stack und Queue, der threadsicheren Vector und HashTable und der threadunsicheren LinkedList TreeMap , usw.!
Die Mitglieder der gesamten Sammlungsfamilie und die Beziehungen zwischen ihnen. Nachfolgend finden Sie eine kurze Einführung in jede der oben genannten Schnittstellen und Basisklassen (hauptsächlich werden die Merkmale und Unterschiede der einzelnen Sammlungen vorgestellt). Eine detailliertere Einführung wird in naher Zukunft einzeln erläutert.
Die Sammlungsschnittstelle ist die grundlegendste Sammlungsschnittstelle Nr Es wird eine direkte Implementierung bereitgestellt. Die vom Java SDK bereitgestellten Klassen sind alle von Collection geerbten „Unterschnittstellen“, z. B. List und Set. Die Sammlung stellt eine Regel dar und die darin enthaltenen Elemente müssen einer oder mehreren Regeln folgen. Einige erlauben beispielsweise die Duplizierung und andere nicht, einige müssen in der richtigen Reihenfolge eingefügt werden und andere verfügen über Hashes, einige unterstützen die Sortierung, andere jedoch nicht.
In Java müssen alle Klassen, die die Collection-Schnittstelle implementieren, zwei Sätze von Standardkonstruktoren bereitstellen, einen ohne Parameter, der zum Erstellen einer leeren Collection verwendet wird, einer ist ein parametrisierter Konstruktor mit Collection-Parametern, der zum Erstellen einer neuen Collection verwendet wird. Diese neue Collection enthält dieselben Elemente wie die übergebene Collection.
Die Listenschnittstelle ist die direkte Schnittstelle von Collection. Liste stellt eine geordnete Sammlung dar, das heißt, sie verwendet eine bestimmte Einfügereihenfolge, um die Reihenfolge der Elemente beizubehalten. Benutzer haben eine genaue Kontrolle über die Einfügeposition jedes Elements in der Liste und können auf Elemente basierend auf ihrem ganzzahligen Index (Position in der Liste) zugreifen und nach Elementen in der Liste suchen. Zu den Sammlungen, die die List-Schnittstelle implementieren, gehören hauptsächlich: ArrayList, LinkedList, Vector und Stack.
ArrayList ist ein dynamisches Array und wird auch am häufigsten verwendet Ich habe eine Sammlung verwendet. Es ermöglicht das Einfügen jedes Elements, das den Regeln entspricht, sogar null. Jede ArrayList hat eine Anfangskapazität (10), die die Größe des Arrays darstellt. Da die Elemente im Container weiter zunehmen, nimmt auch die Größe des Containers zu. Jedes Mal, wenn dem Container ein Element hinzugefügt wird, wird die Kapazität überprüft. Wenn es überläuft, wird die Kapazität erweitert. Daher wenn wir die Anzahl der einzufügenden Elemente kennen, ist es am besten, einen anfänglichen Kapazitätswert anzugeben , um übermäßige Erweiterungsvorgänge zu vermeiden, die Zeit und Effizienz verschwenden .
Die Operationen size, isEmpty, get, set, iterator und listIterator werden alle zu einer festen Zeit ausgeführt. Der Additionsvorgang wird in amortisierter konstanter Zeit ausgeführt, d. h. das Hinzufügen von n Elementen benötigt O(n) Zeit (aus Skalierungsgründen ist dies nicht so einfach wie das Hinzufügen von Elementen mit amortisierten konstanten Zeitkosten).
ArrayList eignet sich gut für Direktzugriff. Gleichzeitig ist ArrayList asynchron.
LinkedList, das auch die List-Schnittstelle implementiert, ist anders von ArrayList. ArrayList ist ein dynamisches Array und LinkedList ist eine doppelt verknüpfte Liste. Zusätzlich zu den grundlegenden Operationsmethoden von ArrayList werden daher auch zusätzliche Get-, Remove- und Insert-Methoden am Anfang oder Ende von LinkedList bereitgestellt.
Aufgrund unterschiedlicher Implementierungsmethoden kann auf LinkedList nicht zufällig zugegriffen werden, und alle seine Vorgänge müssen gemäß den Anforderungen einer doppelt verknüpften Liste ausgeführt werden. Operationen, die in einer Liste indizieren, durchlaufen die Liste vom Anfang oder Ende (vom Ende, das näher am angegebenen Index liegt). Dies hat den Vorteil, dass Einfüge- und Löschvorgänge in der Liste zu geringeren Kosten durchgeführt werden können.
Wie ArrayList ist auch LinkedList asynchron. Wenn mehrere Threads gleichzeitig auf eine Liste zugreifen, müssen sie die Zugriffssynchronisierung selbst implementieren. Eine Lösung besteht darin, beim Erstellen der Liste eine synchronisierte Liste zu erstellen:
List list = Collections.synchronizedList(new LinkedList(...));
ähnelt ArrayList, aber Vector ist synchronisiert. Vector ist also ein threadsicheres dynamisches Array. Seine Funktionsweise ist fast die gleiche wie bei ArrayList.
Stack erbt von Vector und implementiert einen Last-in- First-Out-Stack. Stack bietet 5 zusätzliche Methoden, mit denen Vector als Stack verwendet werden kann. Die grundlegenden Push- und Pop-Methoden sowie die Peek-Methode holen sich das Element oben im Stapel, die leere Methode testet, ob der Stapel leer ist, und die Suchmethode erkennt die Position eines Elements im Stapel. Der Stapel ist nach seiner Erstellung ein leerer Stapel.
Set ist eine Sammlung, die keine wiederholten Elemente enthält . Es behält seine eigene interne Reihenfolge bei, sodass ein wahlfreier Zugriff keinen Sinn macht. Wie List akzeptiert es auch das Vorhandensein von Null, aber nur eines. Aufgrund der Besonderheit der Set-Schnittstelle müssen alle an die Set-Sammlung übergebenen Elemente unterschiedlich sein. Gleichzeitig sollte auf alle veränderlichen Objekte geachtet werden Elemente in der Sammlung, es müssen bestimmte Probleme auftreten. Zu den Sammlungen, die die Set-Schnittstelle implementieren, gehören: EnumSet, HashSet und TreeSet.
ist ein dedizierter Satz für die Aufzählung. Alle Elemente sind Aufzählungstypen.
HashSet kann als der schnellste Abfragesatz bezeichnet werden, weil Es wird intern mit HashCode implementiert. Die Reihenfolge seiner internen Elemente wird durch den Hash-Code bestimmt, er garantiert also nicht die Iterationsreihenfolge der Menge und garantiert insbesondere nicht, dass die Reihenfolge dauerhaft ist.
Generieren Sie basierend auf TreeMap einen Baum, der immer sortiert ist set wird intern mit TreeMap implementiert. Abhängig vom verwendeten Konstruktor werden die Elemente in ihrer natürlichen Reihenfolge oder gemäß dem sortiert, der bei der Erstellung des Sets angegeben wurde. Comparator
Karte unterscheidet sich von List- und Set-Schnittstellen ist eine Sammlung, die aus einer Reihe von Schlüssel-Wert-Paaren besteht und eine Zuordnung vom Schlüssel zum Wert bereitstellt. Gleichzeitig wird die Sammlung nicht geerbt. In Map stellt es eine Eins-zu-Eins-Entsprechung zwischen Schlüssel und Wert sicher. Das heißt, ein Schlüssel entspricht einem Wert, daher kann er nicht denselben Schlüsselwert haben, aber der Wertwert kann natürlich derselbe sein. Zu den Implementierungen von Map gehören: HashMap, TreeMap, HashTable, Properties und EnumMap.
Speicherort, es definiert ein Hash-Tabellenarray (Entry[]-Tabelle). ) verwendet das Element intern die Hash-Konvertierungsfunktion, um die Hash-Adresse des Elements in den im Array gespeicherten Index umzuwandeln Hash-Adresse Sie können den Quellcode von HashMap.Entry anzeigen, bei dem es sich um eine einfach verknüpfte Listenstruktur handelt.
Die Schlüssel werden nach einer bestimmten Sortierregel sortiert und Die interne Reihenfolge ist rot-schwarz (rot-schwarz). Implementierung der Baumdatenstruktur, implementiert die SortedMap-Schnittstelle
wird auch mit einer Hash-Tabellen-Datenstruktur implementiert. Bei der Lösung von Konflikten wird auch eine Hash-verknüpfte Liste wie HashMap verwendet, aber die Leistung ist geringer als bei HashMap
Warteschlange, sie ist hauptsächlich in zwei Kategorien unterteilt, eine ist die Blockierwarteschlange, Elemente werden eingefügt, nachdem die Warteschlange voll ist. Eine Ausnahme wird geworfen, hauptsächlich einschließlich ArrayBlockQueue, PriorityBlockingQueue und LinkedBlockingQueue. Eine andere Art von Warteschlange ist eine doppelendige Warteschlange, die das Einfügen und Entfernen von Elementen am Kopf- und Schwanzende unterstützt, hauptsächlich einschließlich: ArrayDeque, LinkedBlockingDeque und LinkedList.
Quelle: http://www.php .cn/
1, Vektor ist Thread-synchronisiert , daher ist es auch threadsicher, während arraylist threadasynchron und unsicher ist. Wenn Thread-Sicherheitsfaktoren nicht berücksichtigt werden, ist es im Allgemeinen effizienter, Arraylist zu verwenden.
2. Wenn die Anzahl der Elemente in der Sammlung größer ist als die Länge des aktuellen Sammlungsarrays, beträgt die Vektorwachstumsrate 100 % der aktuellen Arraylänge und die Arraylisten-Wachstumsrate 50 % der aktuellen Array-Länge. Wenn beispielsweise eine relativ große Datenmenge in einer Sammlung verwendet wird, hat die Verwendung von Vektoren bestimmte Vorteile.
3. Wenn Sie an einem bestimmten Ort nach Daten suchen, ist die von vector und arraylist benötigte Zeit gleich, beide 0(1). In diesem Fall können Sie entweder vector oder arraylist verwenden . Und wenn die Zeit, die zum Verschieben von Daten an einem bestimmten Ort benötigt wird, 0(n-i) beträgt und n die Gesamtlänge ist, sollten Sie zu diesem Zeitpunkt die Verwendung von Linklist in Betracht ziehen, da zum Verschieben von Daten an einem bestimmten Ort 0(1) benötigt wird Abfrage Die Zeit, die zum Abrufen von Daten an einem bestimmten Ort benötigt wird, beträgt 0(i).
ArrayList und Vector verwenden Arrays zum Speichern von Daten. Die Anzahl der Array-Elemente ist größer als die tatsächlich gespeicherten Daten, sodass Elemente hinzugefügt und eingefügt werden können Das Einfügen von Daten erfordert jedoch Speicheroperationen wie das Verschieben von Array-Elementen. Daher verwendet Vector eine synchronisierte Methode (Thread-Sicherheit), sodass seine Leistung schlechter ist als bei Array LinkedList Verwendet eine doppelt verknüpfte Liste zum Speichern und indiziert Daten nach Seriennummer. Sie müssen vorwärts oder rückwärts durchlaufen werden. Beim Einfügen von Daten müssen Sie jedoch nur die Elemente vor und nach diesem Element aufzeichnen, damit das Einfügen schneller erfolgt! 1.ArrayList basiert auf dynamischem The Datenstruktur des Arrays, LinkedList basiert auf der Datenstruktur der verknüpften Liste. 1. HashMap verwendet Hashcode, um seinen Inhalt zu verarbeiten Schnelle Suche und alle Elemente in TreeMap behalten eine bestimmte feste Reihenfolge bei. Wenn Sie ein geordnetes Ergebnis benötigen, sollten Sie TreeMap verwenden (die Reihenfolge der Elemente in HashMap ist nicht festgelegt). Die Reihenfolge der Elemente in HashMap ist nicht festgelegt. 2. HashMap verwendet Hashcode, um seinen Inhalt schnell zu durchsuchen, während alle Elemente in TreeMap eine bestimmte feste Reihenfolge beibehalten. Wenn Sie geordnete Ergebnisse benötigen, Sie sollten TreeMap verwenden (die Reihenfolge der Elemente in HashMap ist nicht festgelegt). „Collection Framework“ bietet zwei herkömmliche Map-Implementierungen: HashMap und TreeMap (TreeMap implementiert die SortedMap-Schnittstelle 3 , HashMap ist die beste Wahl. Wenn Sie die Schlüssel jedoch in natürlicher oder benutzerdefinierter Reihenfolge durchlaufen möchten, ist für die Verwendung von HashMap eine klar definierte Implementierung von hashCode() und equal() erforderlich . Es gibt keine Optimierungsoptionen, da sich der Baum immer in einem ausgeglichenen Zustand befindet. 1 Historische Gründe: Hashtable basiert auf der alten Dictionary-Klasse und HashMap ist eine Implementierung davon Kartenschnittstelle eingeführt in Java 1.2. Synchronizität: Hashtable ist threadsicher, was bedeutet, dass es synchronisiert ist, während HashMap threadsicher und nicht synchronisiert ist wird im Allgemeinen beim Direktzugriff verwendet. Das Hinzufügen und Löschen von Elementen in ArrayList erfordert schließlich eine Elementverschiebung Nur wenn die Leistung des Programms durch häufiges Einfügen und Löschen von Listen beeinträchtigt wird, sollten Sie LinkedList in Betracht ziehen 1. HashSet wird in gewissem Umfang mit HashCode implementiert dass seine Leistung immer besser ist als die von TreeSet, insbesondere bei Additions- und Suchvorgängen. 3. Obwohl TreeSet nicht so leistungsstark ist wie HashSet, hat es dennoch seinen Nutzen, da es die Reihenfolge der Elemente beibehalten kann. 1. HashMap ist dasselbe wie HashSet und unterstützt die Schnellabfrage. Obwohl HashTable nicht langsam ist, ist es immer noch etwas langsamer als HashMap, sodass HashMap HashTable in der Abfrage ersetzen kann. 2. Da TreeMap die Reihenfolge der internen Elemente beibehalten muss, ist es normalerweise langsamer als HashMap und HashTable.
Das Obige ist der Inhalt. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website (www.php.cn)! 6.2, AArraylist und Linkedlist
2. Für den Direktzugriff zum Abrufen und Festlegen ist ArrayList besser als LinkedList, da LinkedList das Bewegen des Zeigers erfordert.
3. Bei den Neu- und Löschvorgängen „Hinzufügen“ und „Entfernen“ hat LinedList den Vorteil, da ArrayList Daten verschieben muss.
Dies hängt von der tatsächlichen Situation ab. Wenn Sie nur ein einzelnes Datenelement einfügen oder löschen, ist ArrayList schneller als LinkedList. Wenn Daten jedoch stapelweise zufällig eingefügt und gelöscht werden, ist die Geschwindigkeit von LinkedList viel besser als die von ArrayList, da jedes Mal, wenn ein Datenelement in ArrayList eingefügt wird, der Einfügepunkt und alle Daten danach verschoben werden müssen. 6.3, HashMap und TreeMap
3. Wert. : Nur HashMap erlaubt die Verwendung von Nullwerten als Schlüssel oder Wert eines Tabelleneintrags 7. Auswahl von Mengen
7.2. Wahl des Satzes
7.3. Auswahl der Karte