Java-Sammlungen sind grob in vier Systeme unterteilt: Set, List, Queue und Map
Unter diesen stellt Set eine ungeordnete, nicht wiederholbare Sammlung dar; Map stellt eine Zuordnung dar. Eine Sammlung von Beziehungen; Queue ist die Implementierung einer Queue.
Sammlungen unterscheiden sich von Array-Elementen. Sie können entweder Basistypwerte oder Objekte sein (tatsächlich können Sammlungen nur Referenzvariablen speichern). ).
Es gibt zwei abgeleitete Schnittstellen in Java-Sammlungen: Collection und Map
Vererbungsbaum des Collection-Sammlungssystems:
Vererbungsbaum des Kartensammlungssystems:
Im Folgenden wird die
Set-Sammlung beschrieben:
Set-Sammlung ähnelt a jar, das Programm Sie können mehrere Objekte nacheinander hineinwerfen. Set merkt sich nicht die Reihenfolge, in der Elemente hinzugefügt werden, und Set-Sammlungen erlauben nicht die gleichen Elemente.
HashSet:
Eigenschaften:
Die Reihenfolge der Elemente ist nicht garantiert
HashSet ist nicht synchronisiert
Der festgelegte Elementwert kann null sein
Der Standard für HashSet zur Beurteilung der Gleichheit zweier Elemente lautet: Die beiden Objekte werden durch die Methode equal() gleich verglichen, und die Rückgabewerte der Methode hashcode() der beiden Objekte sind ebenfalls gleich .
Hinweis: Wenn Sie beim Einfügen eines Objekts in ein HashSet die Methode equal() des Objekts überschreiben müssen, sollten Sie dessen Methode hashCode() überschreiben. Die Regel lautet: Wenn zwei Objekte über die Methode equal() verglichen werden und true zurückgeben, sollten die HashCode-Werte der beiden Objekte gleich sein.
LinkedSet:
LinkedSet bestimmt den Speicherort von Elementen basierend auf dem ursprünglichen HashCode-Wert, verwendet aber auch eine verknüpfte Liste, um die Reihenfolge der Elemente beizubehalten , damit die Elemente Die Reihenfolge des Einfügens bleibt erhalten. LinkedSet greift auf die Elemente im Satz in der Reihenfolge zu, in der sie hinzugefügt werden.
LinkedSet muss die Einfügeposition von Elementen beibehalten, daher ist die Leistung etwas geringer als die von HashSet.
TreeSet:
TreeSet stellt sicher, dass die Sammlungselemente in einem sortierten Zustand sind.
TreeSet wird nicht nach der Einfügereihenfolge der Elemente sortiert, sondern nach dem tatsächlichen Wert der Elemente.
TreeSet verwendet die rot-schwarze Baumdatenstruktur zum Speichern von Set-Elementen.
TreeSet unterstützt zwei Sortiermethoden: natürliche Sortierung und benutzerdefinierte Sortierung. Standardmäßig verwendet TreeSet die natürliche Reihenfolge.
Natürliche Sortierung: TreeSet ruft die Methode „compareTo“ (Object obj) der Sammlungselemente auf, um die Größenbeziehung zwischen den Elementen zu vergleichen, und ordnet dann die Sammlungselemente in aufsteigender Reihenfolge an. Standardmäßig verwendet TreeSet die natürliche Reihenfolge.
Wenn ein Objekt zur TreeSet-Sammlung hinzugefügt wird, ruft TreeSet die Methode „compareTo“ (Object obj) des Objekts auf, um die Größe mit anderen Objekten im Container zu vergleichen, und findet dann seinen Speicherort gemäß der rot-schwarzen Baumstruktur .
Das einzige Kriterium zur Beurteilung, ob zwei Objekte gleich sind, ist: Ob zwei Objekte 0 zurückgeben, wenn sie mit der Methode „compareTo“ (Object obj) verglichen werden.
Wenn der Vergleich zweier Objekte mit der Methode equal() „true“ zurückgibt, sollte der Vergleich der beiden Objekte mit der Methode „compareTo(Object obj)“ 0 zurückgeben.
Benutzerdefinierte Sortierung: Wenn Sie eine benutzerdefinierte Sortierung implementieren müssen, müssen Sie beim Erstellen des TreeSet-Sammlungsobjekts ein Comparator-Objekt bereitstellen, das mit der TreeSet-Sammlung verknüpft ist. Das Comparator-Objekt ist für die Sortierlogik der Sammlungselemente verantwortlich .
EnumSet:
Die Auflistungselemente von EnumSet bestimmen auch die Reihenfolge der Auflistungselemente basierend auf der Positionierungsreihenfolge der Aufzählungswerte innerhalb der Enum-Klasse.
EnumSet wird intern in Form von Bitvektoren gespeichert.
Die EnumSet-Sammlung erlaubt das Hinzufügen von Nullelementen nicht.
Leistungsanalyse jeder Set-Implementierungsklasse:
Die Leistung von HashSet ist immer besser als die von TreeSet, da TreeSet einen zusätzlichen Rot-Schwarz-Baum-Algorithmus benötigt, um die Reihenfolge des Satzes aufrechtzuerhalten.
LinkedSet Bei normalen Einfüge- und Löschvorgängen ist LinkedSet etwas langsamer als HashSet. Dies liegt an dem zusätzlichen Aufwand, der durch die Pflege der verknüpften Liste entsteht. Aufgrund der verknüpften Liste ist das Durchlaufen von LinkedSet jedoch schneller.
EnumSet bietet die beste Leistung, kann jedoch nur Aufzählungswerte derselben Aufzählungsklasse als Set-Elemente speichern.
Liste:
Liste stellt eine geordnete, wiederholbare Kombination von Elementen dar. Jedes Element in der Menge hat einen entsprechenden sequentiellen Index.
Die Listensammlung kann basierend auf dem Positionsindex auf Elemente in der Sammlung zugreifen, sodass die Liste mithilfe einer for-Schleife durchlaufen werden kann.
ArrayList, LinkedList und Vector
ArrayList-Quellcode-Analyse:
LinkedList-Quellcode-Analyse:
Warteschlange:
Warteschlange wird verwendet. Sie wird verwendet, um die Datenstruktur der Warteschlange zu simulieren.
PriorityQueue:
Die Reihenfolge, in der die Warteschlangenelemente von PriorityQueue gespeichert werden, entspricht nicht der Reihenfolge des Beitritts, sondern der Größe der Warteschlangenelemente.
PriorityQueue lässt das Einfügen von Nullelementen nicht zu.
Deque:
Die Deque-Schnittstelle ist eine Unterschnittstelle der Queue-Schnittstelle, die eine doppelendige Warteschlange darstellt.
Wenn eine Datenstruktur wie ein „Stapel“ in einem Programm verwendet werden muss, wird die Verwendung von ArrayDeque empfohlen.
Leistungsanalyse verschiedener linearer Tabellen:
1. Wenn Sie List-Sammlungselemente durchlaufen müssen, sollten Sie für ArrayList- und Vector-Sammlungen die Direktzugriffsmethode (get) verwenden, um die Sammlung zu durchlaufen Elemente, damit die Leistung besser ist; für LinkedList-Sammlungen sollten Sie einen Iterator verwenden, um die Sammlungselemente zu durchlaufen.
2. Wenn Sie häufig Einfügen und Löschen durchführen müssen, sollte LinkedList verwendet werden.
3. Wenn mehrere Threads gleichzeitig auf Elemente in der List-Sammlung zugreifen, sollten Sammlungen verwendet werden, um die Sammlung in eine thread-sichere Sammlung zu verpacken.
Map:
Map-Schlüssel dürfen nicht wiederholt werden, d. h. zwei beliebige Schlüssel desselben Map-Objekts geben beim Vergleich mit der Methode equal immer false zurück.
Es gibt eine keySet()-Methode in Map, die verwendet wird, um einen Satz zurückzugeben, der aus allen Schlüsseln in der Map besteht.
HashMap, Hashtable:
Der Unterschied zwischen HashMap und Hashtable:
1. Hashtable ist eine Thread-sichere Map, HashMap ist nicht Thread-sicher, HashMap also bessere Leistung.
2.Hashtable erlaubt nicht die Verwendung von Null als Schlüssel und Wert und HashMap erlaubt die Verwendung von Null als Schlüssel oder Wert.
Das Kriterium zur Beurteilung der Gleichheit zweier Schlüssel in Hashtable und HashMap ist: Die Methode equal() der beiden Schlüssel gibt true zurück, und die HashCode-Werte der beiden Schlüssel sind die gleichen Um die Gleichheit zweier Werte zu beurteilen, gibt die Methode equal() des Werts denselben Wert zurück.
LinkedMap:
LinkedMap merkt sich die Reihenfolge, in der Schlüsselwerte hinzugefügt werden.
TreeMap:
TreeMap verwendet auch eine rot-schwarze Baumstruktur. Der Standard zur Beurteilung der Gleichheit zweier Schlüssel in TreeMap ist:
Zwei Schlüssel übergeben das CompareTo(). method Der Rückgabewert ist 0. (Bei natürlicher Sortierung)
Der Rückgabewert der beiden Schlüssel durch die Methode CompareTo() ist 0. Gleichzeitig gibt die Methode equal() true zurück. (Unter benutzerdefinierter Sortierung).
EnumMap:
EnumMap wird intern in Form eines Arrays gespeichert.
EnumMap erlaubt nicht null als Schlüssel, lässt jedoch zu, dass der Wert null ist.
Analyse der Kartenleistung:
Die Leistung von HashMap ist besser als die von Hashtable.
Die Schlüssel-Wert-Paare in TreeMap befinden sich immer in einem geordneten Zustand und es ist kein spezieller Sortiervorgang erforderlich.
Für allgemeine Anwendungsszenarien sollten Sie die Verwendung von HashMap in Betracht ziehen.
LinkedMap ist langsamer als HashMap, da eine verknüpfte Liste verwaltet werden muss, um die Reihenfolge der Schlüsselwertaddition beizubehalten.
EnumMap bietet die beste Leistung, kann jedoch nur Aufzählungswerte derselben Aufzählungsklasse als Schlüssel verwenden.
Verwandte Empfehlungen:
Traversal-Methoden der Java-Sammlung Set, List, Map
Ein Stück Code, den man verstehen sollte Java-Verwendung von List, Set und Map
Das obige ist der detaillierte Inhalt vonJava-Sammlung: Zusammenfassung der vier Systeme Set, List, Queue und Map. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!