Lineare Tabellen, verknüpfte Listen und Hash -Tabellen werden häufig verwendete Datenstrukturen. Bei der Entwicklung von Java hat JDK uns eine Reihe von entsprechenden Klassen zur Implementierung grundlegender Datenstrukturen zur Verfügung gestellt. Diese Klassen befinden sich alle im Java.util -Paket. In diesem Artikel wird versucht, den Lesern die Rolle jeder Klasse zu erklären und wie man sie durch eine einfache Beschreibung korrekt verwendet.
Sammlung ├LIST │✜LINKEDLIST │✜ArrayList │└Vector │└Stack └Set Map ├Hashtable ├HashMap └WeakhashMap
Sammlungsschnittstelle
Die Sammlung ist die grundlegendste Sammlungsschnittstelle. Eine Sammlung repräsentiert eine Reihe von Objekten, dh die Elemente der Sammlung (Elemente). Einige Sammlungen erlauben die gleichen Elemente, während andere nicht. Einige können sortieren, andere können nicht. Der Java SDK bietet keine Klassen, die direkt aus der Sammlung geerbt werden. Die vom Java SDK bereitgestellten Klassen sind alle "Subinterfaces", die aus der Sammlung wie List und Set geerbt werden.
Alle Klassen, die die Sammelschnittstelle implementieren, müssen zwei Standardkonstruktoren bereitstellen: Der parameterlose Konstruktor wird verwendet, um eine leere Sammlung zu erstellen, und ein Sammelparameterkonstruktor wird verwendet, um eine neue Sammlung zu erstellen, die dieselben Elemente wie die eingehende Sammlung aufweist. Der letztere Konstruktor ermöglicht es dem Benutzer, eine Sammlung zu kopieren.
Wie kann man jedes Element in einer Sammlung durchführen? Unabhängig von der tatsächlichen Art der Sammlung unterstützt sie eine Iterator () -Methode, die einen Iterator zurückgibt, und verwendet diesen Iterator, um auf jedes Element in der Sammlung nacheinander zuzugreifen.
Typische Verwendung sind wie folgt:
Iterator it = collection.iterator (); // einen Iterator wob // das nächste Element bekommen}
Die beiden von der Sammlungsschnittstelle abgeleiteten Schnittstellen sind Liste und festgelegt.
Listenschnittstelle
List ist eine geordnete Sammlung. Mit dieser Schnittstelle können Sie die Position der einzelnen Elementeinfügungen genau steuern. Benutzer können Indizes (die Position von Elementen in der Liste, ähnlich wie bei Array -Einweisen) verwenden, um in der Liste auf Elemente zuzugreifen, die den Arrays von Java ähnlich sind.
Im Gegensatz zum unten erwähnten Satz erlaubt die Liste dieselben Elemente.
Zusätzlich zur Iterator () -Methode mit der erforderlichen Iterator () -Methode enthält die Liste auch eine ListIterator () -Methode, die eine Listiterator -Schnittstelle zurückgibt. Im Vergleich zur Standard -Iterator -Schnittstelle verfügt ListIterator über mehr Methoden wie Add (), wobei das Hinzufügen, Löschen, Festlegen von Elementen und das Durchqueren von Vorwärts oder Rückwärts geführt werden können.
Gemeinsame Klassen, die Listenschnittstellen implementieren, umfassen LinkedList, ArrayList, Vector und Stack.
LinkedList -Klasse
Die LinkedList implementiert die Listenschnittstelle und ermöglicht Nullelemente. Darüber hinaus bietet LinkedList zusätzliche GET, Entfernen, Einfügen und Einfügen von Methoden am Kopf oder Schwanz der LinkedList. Diese Operationen ermöglichen es LinkedList, als Stapel, Warteschlange oder Zwei-Wege-Warteschlange zu verwenden.
Beachten Sie, dass die LinkedList keine synchrone Methode hat. Wenn mehrere Threads gleichzeitig auf eine Liste zugreifen, müssen Sie die Zugriffssynchronisation selbst implementieren. Eine Lösung besteht darin, beim Erstellen einer synchronen Liste zu konstruieren:
Listlist = collections.synchronizedList (Neue LinkedList (...));
ArrayList -Klasse
ArrayList implementiert Arrays mit variabler Größe. Es ermöglicht allen Elementen, einschließlich Null. ArrayList wird nicht synchronisiert.
Die Laufzeit der Größe der Größe, Isempty, Get, Set -Methoden ist konstant. Der Overhead der Add -Methode ist jedoch eine amortisierte Konstante, und es dauert O (n) Zeit, um N -Elemente hinzuzufügen. Die anderen Methoden haben eine lineare Laufzeit.
Jede ArrayList -Instanz hat eine Kapazität, die die Größe des Arrays hat, das zum Speichern von Elementen verwendet wird. Diese Kapazität kann automatisch zunehmen, wenn neue Elemente ständig hinzugefügt werden, der Wachstumsalgorithmus ist jedoch nicht definiert. Wenn eine große Anzahl von Elementen eingefügt werden muss, kann die Sicherungscoapacity -Methode vor dem Einfügen aufgerufen werden, um die Kapazität der Arraylist zu erhöhen, um die Insertionseffizienz zu verbessern.
Wie LinkedList ist auch ArrayList unsynchronisiert.
Vektorklasse
Der Vektor ist ArrayList sehr ähnlich, aber Vektor ist synchron. Obwohl der von Vector erstellte Iterator dieselbe Schnittstelle wie der von ArrayList erstellte Iterator ist, da der Vektor synchronisiert ist. Wenn ein Iterator erstellt wird und verwendet wird, ändert ein anderer Thread den Status des Vektors (zum Beispiel hinzuzufügen oder zu entfernen). Eine gleichzeitige Ausnahme wird eingesetzt, wenn die Iterator -Methode genannt wird.
Stapelklasse
Stack erbt von Vector und implementiert einen letzten Stack. Stack bietet 5 zusätzliche Methoden, mit denen Vektor als Stapel verwendet werden kann. Die grundlegenden Push- und POP -Methoden und die Peek -Methode erheben die Elemente oben im Stapel, die leere Methode testet, ob der Stapel leer ist, und die Suchmethode erkennt die Position eines Elements im Stapel. Stack ist nur erstellt und ist ein leerer Stapel.
Setzen Sie die Schnittstelle
SET ist eine Sammlung, die keine doppelten Elemente enthält, dh zwei beliebige Elemente E1 und E2 haben E1.Equals (E2) = Falsch, und das SET hat höchstens ein Nullelement.
Offensichtlich hat der Konstruktor von SET eine Einschränkung, und der übergebene Sammlungsparameter kann keine doppelten Elemente enthalten.
Bitte beachten Sie: Veränderliche Objekte müssen mit Sorgfalt betrieben werden. Wenn ein veränderliches Element in einem Satz seinen eigenen Zustand ändert, verursacht es Objekt.Equals (Objekt) = treu, um einige Probleme zu verursachen.
Kartenschnittstelle
Bitte beachten Sie, dass die Karte die Sammlungsschnittstelle nicht erbt und die Karte eine Zuordnung von Schlüssel zu Wert bietet. Eine Karte kann nicht denselben Schlüssel enthalten, und jeder Schlüssel kann nur einen Wert zuordnen. Die Kartenschnittstelle bietet drei Arten von Ansichten der Sammlung. Der Inhalt der Karte kann als eine Reihe von Schlüsselsammlungen, eine Reihe von Wertungssammlungen oder eine Reihe von Schlüsselwertzuordnungen angesehen werden.
Hashtable -Klasse
Hashtable implementiert die Kartenschnittstelle, um eine Hash-Tabelle mit einem Schlüsselwert-Zuordnung zu implementieren. Jedes Nicht-Null-Objekt kann als Schlüssel oder Wert verwendet werden.
Verwenden Sie Put (Schlüssel, Wert), um Daten hinzuzufügen. Verwenden Sie GET (Schlüssel), um Daten abzurufen. Der Zeitaufwand dieser beiden grundlegenden Operationen ist konstant.
Hashtable passt die Leistung durch die anfänglichen Kapazitäts- und Lastfaktorparameter an. Normalerweise kann der Standardlastfaktor 0,75 Zeit- und Raumausgleich besser erreichen. Das Erhöhen des Lastfaktors kann Platz sparen, aber die entsprechende Suchzeit erhöht sich, was sich auf die Operationen wie Get and Put auswirkt.
Ein einfaches Beispiel für die Verwendung eines Hashtabels ist wie folgt: Stellen Sie 1, 2 und 3 in einen Hashtable ein, und ihre Schlüssel sind "eins", "zwei", "drei":
Hashtable nummern = neuer Hashtable ();
nummern.put ("eins", neue Ganzzahl (1));
nummern.put ("zwei", neue Integer (2));
nummern.put ("drei", neue Ganzzahl (3));
Verwenden Sie den entsprechenden Schlüssel, um eine Nummer wie 2 herauszunehmen:
Ganzzahl n = (Integer) number.get ("zwei");
System.out.println ("Two =" + n);
Da ein Objekt als Schlüssel die Position des entsprechenden Werts durch Berechnung seiner Hash -Funktion bestimmt, muss jedes Objekt als Schlüssel den HashCode und gleiche Methoden implementieren. Der HashCode und die Equals -Methoden erben aus dem Stammklassenobjekt. Wenn Sie eine benutzerdefinierte Klasse als Schlüssel verwenden, seien Sie sehr vorsichtig. Gemäß der Definition der Hash -Funktion, wenn die beiden Objekte gleich sind, dh obj1.equals (obj2) = wahr, muss ihr HashCode gleich sein, aber wenn die beiden Objekte unterschiedlich sind, sind ihre Hashcodes möglicherweise nicht unterschiedlich. Wenn die Hashcodes von zwei verschiedenen Objekten gleich sind, wird dieses Phänomen als Konflikt bezeichnet. Der Konflikt erhöht den Zeitaufwand für den Betrieb der Hash -Tabelle. Versuchen Sie daher, die Methode von HashCode () zu definieren, um den Betrieb der Hash -Tabelle zu beschleunigen.
Wenn dasselbe Objekt unterschiedliche Hashcodes hat, hat der Betrieb in der Hash -Tabelle unerwartete Ergebnisse (die erwartete GET -Methode gibt NULL zurück). Um dieses Problem zu vermeiden, müssen Sie sich nur an eine Sache erinnern: Sie sollten die Equals -Methode und die Hashcode -Methode gleichzeitig neu schreiben, anstatt nur eine davon zu schreiben.
Hashtable wird synchronisiert.
Hashmap -Klasse
HashMap ist ähnlich wie Hashtable. Der Unterschied besteht darin, dass Hashmap asynchron ist und Null zulässt, d. H. Nullwert und Nullschlüssel. Aber wenn HashMap als Sammlung angesehen wird (die VALUTE () -Methode kann eine Sammlung zurückgeben), ist die iterative Unteroperationszeit proportional zur Kapazität von HashMap. Wenn die Leistung von Iterationsoperationen sehr wichtig ist, setzen Sie die Initialisierungskapazität von HashMap nicht auf zu hoch oder der Lastfaktor ist zu niedrig.
WeaChashMap -Klasse
WeaphasMap ist eine verbesserte Hashmap, die "schwache Referenz" auf den Schlüssel implementiert. Wenn auf extern nicht mehr ein Schlüssel verwiesen wird, kann der Schlüssel von GC recycelt werden.
Zusammenfassen
Wenn Stack, Warteschlangen und andere Operationen beteiligt sind, sollten Sie in Betracht ziehen, die Liste zu verwenden. Für Elemente, die schnell eingefügt und gelöscht werden müssen, sollten Sie LinkedList verwenden. Wenn schnell auf Elemente zugegriffen werden müssen, sollten Sie ArrayList verwenden.
Java.util.Collections Class -Paket
Die Java.util.Collections -Klasse enthält viele nützliche Methoden, die die Arbeit von Programmierern erleichtern können. Diese Methoden sind jedoch normalerweise nicht vollständig verwendet. Javadoc enthält die vollständigste Beschreibung der Sammlungsklasse: "Diese Klasse enthält eine dedizierte statische Klasse, die eine Sammlung bedienen oder zurückgeben kann.
”1.2 Methoden enthalten
Iterator, ArrayList, Elemente, Puffer, Karte, Sammlungen
Liezi:
Import Java.util.ArrayList; Import Java.util.Collection; Import Java.util.Collections; Java.util.comParator importieren; importieren java.util.list; öffentliche Klasse CollectionsSort {public CollectionsSort () {} public static void main (String [] args) {double Array [] = {111, 111, 23, 456, 231}; Listlist = new ArrayList (); List li = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); //List.add("+Array Appan)); } double arr [] = {111}; für (int j = 0; j <arr.Length; j ++) {li.add (neues double (arr [j])); }}2. Spezifische Operationen
1) sortieren (sortieren)
Verwenden Sie die Sortiermethode, um die angegebene Liste in aufsteigender Reihenfolge gemäß der natürlichen Reihenfolge der Elemente zu sortieren. Alle Elemente in der Liste müssen die vergleichbare Schnittstelle implementieren. Alle Elemente in dieser Liste müssen mit dem angegebenen Komparator miteinander verglichen werden
Doppelarray [] = {112, 111, 23, 456, 231}; für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Collectionss.sort (Liste); für (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Ergebnis: 112,111,23,456,2312) Mischen
Der Hybridanordnungalgorithmus macht genau das Gegenteil: Es stört alle Permutationen, die in einer Liste zu finden sind. Das heißt, die Liste wird basierend auf der Eingabe der zufälligen Quelle neu angeordnet, eine solche Anordnung hat die gleiche Möglichkeit (vorausgesetzt, die Zufallsquelle ist fair). Dieser Algorithmus ist sehr nützlich bei der Implementierung eines Glücksspiels. Zum Beispiel kann es verwendet werden, um eine Liste von Kartenobjekten zu mischen, die ein Kartenspiel darstellen. Darüber hinaus ist es auch bei Testfällen sehr nützlich.
Collections.Shuffling (Liste) Doppelarray [] = {112, 111, 23, 456, 231}; für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Collections.shuffle (Liste); für (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Ergebnis: 112,111,23,456,2313) umgekehrt
Verwenden Sie die umgekehrte Methode, um die angegebene Liste in absteigender Reihenfolge gemäß der natürlichen Reihenfolge der Elemente zu sortieren.
Collections.Reverse (Liste) Doppelarray [] = {112, 111, 23, 456, 231}; für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Sammlungen. Reverse (Liste); für (int i = 0; i <array.length; i ++) {System.out.println (li.get (i)); } // Ergebnis: 231.456,23,111,112 4) Ersetzen Sie alle Elemente in der angegebenen Liste durch das angegebene Element. String str [] = {"dd", "aa", "bb", "cc", "ee"}; für (int j = 0; j <Str.Length; j ++) {li.add (neue String (str [j])); } Collections.fill (li, "aaa"); für (int i = 0; i <li.size (); i ++) {System.out.println ("list [" + i + "] =" + li.get (i)); } // Ergebnis: AAA, AAA, AAA, AAA5) Kopie (Kopie)
Verwenden Sie zwei Parameter, eine Zielliste und eine Quellliste, um das Quellelement in das Ziel zu kopieren und seinen Inhalt zu überschreiben. Die Zielliste ist mindestens so lang wie die Quelle. Wenn es länger ist, sind die verbleibenden Elemente in der Zielliste nicht betroffen.
Collections.copy (Liste, LI): Der letztere Parameter ist die Zielliste. Die vorherige ist die Quellliste
Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); List li = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } double arr [] = {1131,333}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; für (int j = 0; j <arr.Length; j ++) {li.add (neues double (arr [j])); } Collections.copy (Liste, li); für (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Ergebnis: 1131,333,23,456,2316) Gibt das kleinste Element in Sammlungen zurück (min)
Gibt das kleinste Element der angegebenen Sammlung gemäß der Reihenfolge zurück, in der der angegebene Komparator erzeugt wird. Alle Elemente in der Sammlung müssen über den angegebenen Komparator miteinander verglichen werden
Sammeln.min (Liste) Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Collections.min (Liste); für (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Ergebnis: 237) Gibt das kleinste Element (max) in Sammlungen zurück
Gibt das maximale Element der angegebenen Sammlung gemäß der Reihenfolge zurück, in der der angegebene Komparator erzeugt wird. Alle Elemente in der Sammlung müssen über den angegebenen Komparator miteinander verglichen werden
Sammeln.max (Liste) Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Collections.max (Liste); für (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Ergebnis: 4568) LastIndexofSublist
Gibt die Startposition der angegebenen Zielliste zurück, die zuletzt in der angegebenen Quellliste angezeigt wurde
int count = collections.lastIndexofSublist (Liste, li); Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); List li = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } double arr [] = {111}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; für (int j = 0; j <arr.Length; j ++) {li.add (neues double (arr [j])); } Int popals = Sammlungen. lastIndexofSublist (Liste, li); System.out.println ("==="+ Standorte); // Ergebnis 39) IndexofSublist
Gibt die Startposition des ersten Males zurück, in dem die angegebene Zielliste in der angegebenen Quellliste angezeigt wird
int count = collections.indexofSublist (Liste, li); Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); List li = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } double arr [] = {111}; String str [] = {"dd", "aa", "bb", "cc", "ee"}; für (int j = 0; j <arr.Length; j ++) {li.add (neues double (arr [j])); } Int popals = collections.indexofSublist (Liste, li); System.out.println ("==="+ Standorte); // Ergebnis 110) drehen
Zyklisch Elemente in der angegebenen Liste basierend auf der angegebenen Entfernung zyklisch verschieben
Collections.Rotate (Liste, -1);
Wenn es sich um eine negative Zahl handelt, bewegt es sich positiv, und wenn es sich positiv bewegt, bewegt es sich positiv.
Doppelarray [] = {112, 111, 23, 456, 231}; Listlist = new ArrayList (); für (int i = 0; i <array.length; i ++) {list.add (neues Double (Array [i])); } Collectionss.Rotate (Liste, -1); für (int i = 0; i <list.size (); i ++) {System.out.println ("list [" + i + "] =" + list.get (i)); } // Ergebnis: 111,23,456,231,112In dem obigen Artikel werden kurz die Sammlung von Implementierungsklassen und die Karte der häufig verwendeten Datenstrukturen in Java erörtert. Dies ist alles der Inhalt, den ich mit Ihnen geteilt habe. Ich hoffe, Sie können Ihnen eine Referenz geben und ich hoffe, Sie können wulin.com mehr unterstützen.