Das hierarchische Strukturdiagramm (Quelle und Netzwerk) der Collection-Klasse lautet wie folgt:
Schnittstelle: Iterator
public interface Iterable<T>
Die Iterable
Schnittstelle: Sammlung
public interface Collection<E> extends Iterable<E>
Die Stammschnittstelle in der Sammlungshierarchie. Eine Sammlung stellt eine Menge von Objekten dar, die auch als Elemente einer Sammlung bezeichnet werden. Einige Sammlungen erlauben doppelte Elemente (z. B. List, Queue), andere nicht (z. B. Set). Einige Sammlungen sind geordnet (z. B. List, TreeSet, LinkedHashSet, TreeMap, LinkedHashMap), während andere ungeordnet sind (z. B. HashSet, HashMap). Das JDK bietet keine direkte Implementierung dieser Schnittstelle: Es bietet Implementierungen spezifischerer Unterschnittstellen wie Set und List. Diese Schnittstelle wird normalerweise verwendet, um Sammlungen zu übergeben und sie überall dort zu bearbeiten, wo maximale Allgemeingültigkeit erforderlich ist.
Schnittstelle: Liste
public interface List<E> extends Collection<E>
Geordnete Sammlung (auch Sequenz genannt). Die List-Schnittstelle fügt eine große Anzahl von Methoden hinzu, die auf der Collection-Schnittstelle basieren und eine präzise Steuerung der Einfüge- oder Entfernungsposition jedes Elements in der Liste ermöglichen. Benutzer können auf Elemente basierend auf ihrem ganzzahligen Index (Position in der Liste) zugreifen und nach Elementen in der Liste suchen.
Die List-Schnittstelle fügt den Verträgen der Iterator-, Add-, Remove-, Equals- und HashCode-Methoden einige weitere Konventionen hinzu, die über die in der Collection-Schnittstelle angegebenen hinausgehen.
Die List-Schnittstelle bietet Positionierungs- (Indizierungs-) Zugriffsmethoden für Listenelemente. Listen (wie Java-Arrays) basieren auf 0. Beachten Sie, dass diese Vorgänge möglicherweise in einer Zeit ausgeführt werden, die proportional zum Indexwert einiger Implementierungen ist (z. B. der LinkedList-Klasse). Wenn Sie die spezifische Implementierung nicht kennen, ist daher das Durchlaufen der Elemente der Liste (Iterator oder foreach-Schleife) normalerweise besser als das Durchlaufen der Liste mit Index (for-Schleife).
Die List-Schnittstelle bietet einen speziellen Iterator namens ListIterator. Zusätzlich zu den normalen Operationen, die von der Iterator-Schnittstelle bereitgestellt werden, ermöglicht dieser Iterator auch das Einfügen und Ersetzen von Elementen sowie den bidirektionalen Zugriff. Außerdem wird eine Methode bereitgestellt, um einen Listeniterator zu erhalten, der an einer angegebenen Position in der Liste beginnt.
Abstrakte Klasse: AbstractCollection
public abstract class AbstractCollection<E> extends Object implements Collection<E>
Diese Klasse stellt die Backbone-Implementierung der Collection-Schnittstelle bereit und implementiert die List-, Set- und Queue-Schnittstellen der Sammlungsschnittstellen können diese abstrakte Klasse erben, um den Arbeitsaufwand für die Implementierung dieser Schnittstelle zu minimieren.
Diese Schnittstelle implementiert andere Schnittstellen in Collection außer Größe und Iterator und schränkt die Add-Methode ein.
Um eine unveränderliche Sammlung zu implementieren, müssen Programmierer nur diese Klasse erweitern und Implementierungen der Iterator- und Größenmethoden bereitstellen. (Der von der Iterator-Methode zurückgegebene Iterator muss hasNext und next implementieren.)
Um eine modifizierbare Sammlung zu implementieren, müssen Programmierer zusätzlich zur Erweiterung dieser Klasse und der Bereitstellung von Implementierungen der Iterator- und Größenmethoden add zusätzlich diese Klasse neu schreiben Methode (andernfalls wird UnsupportedOperationException ausgelöst), muss der von der Iterator-Methode zurückgegebene Iterator auch seine Remove-Methode implementieren.
Abstrakte Klasse: AbstractList
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E>
Diese Klasse stellt die Backbone-Implementierung der List-Schnittstelle bereit, um die Notwendigkeit der Implementierung der Datenspeicherung mit „wahlfreiem Zugriff“ zu minimieren (Zum Beispiel unterstützt das Array (ArrayList) die von der Schnittstelle benötigte Arbeit (d. h. die Implementierung der List-Schnittstelle erstreckt sich von der Collection-Schnittstellenmethode). Bei Methoden, die die Collection-Schnittstelle implementieren, wird diese Klasse durch Erben der abstrakten Klasse AbstractCollection implementiert. Zu den nicht implementierten Methoden dieser Klasse gehören get(int index) und size() sowie die Methoden set(int index, E element), add(int index, E element), Remove(int index), add(E element). Einschränkungen.
Für kontinuierliche Zugriffsdaten (z. B. verknüpfte Liste LinkedList) sollte AbstractSequentialList dieser Klasse vorgezogen werden.
Um eine nicht veränderbare Liste zu implementieren, muss der Programmierer nur diese Klasse erweitern und Implementierungen der Methoden get(int) und size() bereitstellen.
Um eine änderbare Liste zu implementieren, müssen Programmierer zusätzlich die Methode set(int, E) überschreiben (andernfalls wird eine UnsupportedOperationException ausgelöst). Wenn die Liste eine variable Größe hat, muss der Programmierer zusätzlich die Methoden add(int, E) und remove(int) überschreiben.
Klasse: ArrayList
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, Serializable
ArrayList ist eine auf Arrays variabler Größe basierende Implementierung der List-Schnittstelle. Die unterste Ebene verwendet eine Array-Implementierung und verfügt daher über gute Direktzugriffsfunktionen, ist jedoch für Vorgänge wie das Einfügen und Löschen an bestimmten Speicherorten nicht effizient.
Jede ArrayList-Instanz hat eine Kapazität. Die Kapazität bezieht sich auf die Größe des Arrays, das zum Speichern von Listenelementen verwendet wird. Wenn die ArrayList-Kapazitätsgröße nicht angegeben ist, beträgt die Standardkapazität der erstellten Instanz 10. Wenn der ArrayList Elemente hinzugefügt werden, erhöht sich ihre Kapazität automatisch.
Iteratoren, die von den Methoden iterator und listIterator dieser Klasse zurückgegeben werden, sind ausfallsicher: Nachdem der Iterator erstellt wurde, kann die Liste zu keinem Zeitpunkt oder auf irgendeine Weise abgerufen werden, es sei denn, die Liste wird durch das Entfernen oder Hinzufügen des Iterators selbst strukturell geändert Wenn die Liste geändert wird, löst der Iterator eine ConcurrentModificationException aus. Daher wird der Iterator angesichts gleichzeitiger Änderungen schnell vollständig ausfallen, anstatt zu einem unbestimmten Zeitpunkt in der Zukunft willkürliches, nicht deterministisches Verhalten zu riskieren.