Quelle des Artikels: Internet Autor: PaleSting/CSDN
In diesem Artikel werden wir uns mit Datentypen in Java befassen, aber wir werden das Konzept der abstrakten Datentypen (ADT) vorstellen. Wir werden auch einige der von Java definierten ADTs kennenlernen, indem wir das Java Collections Framework vorstellen.
ADT
Ein ADT wird nur durch den Datentyp definiert, den es enthält, und durch die Operationen, die an diesem Datentyp ausgeführt werden können. Entwickler können nur über die Operationsmethoden von ADT auf die Eigenschaften von ADT zugreifen und wissen nicht, wie die verschiedenen Operationen innerhalb dieses Datentyps implementiert werden.
In Java verwenden wir häufig eine Schnittstelle, um eine Reihe von Operationen bereitzustellen, ohne die Details der Implementierung dieser Operationen preiszugeben. Denken Sie daran, dass eine Schnittstelle eine Reihe von Methoden definiert und eine Java-Klasse diese Menge implementieren muss, um ihre obligatorischen Bedingungen zu erfüllen oder eine Instanz der Schnittstelle zu implementieren.
Lineare Tische, Stapel und Warteschlangen
Wenn wir über ADT sprechen, sprechen wir oft von linearen Listen, Stapeln und Warteschlangen. Wir werden nicht auf die Details dieser Datenstrukturen eingehen, sondern darauf, warum sie ADTs genannt werden.
Eine lineare Liste ist eine Sammlung finiter Elemente, die linear angeordnet sind und direkten Zugriff auf ihre Elemente ermöglichen. Ein Stapel ist eine nach dem Last-In-First-Out-Prinzip (LIFO) geordnete lineare Liste. Elemente werden zum Kopf des Stapels hinzugefügt und daraus entfernt. Eine Warteschlange ist eine nach dem Prinzip „First-In-First-Out“ geordnete lineare Liste. Elemente werden am Ende der Warteschlange hinzugefügt und vom Kopf der Warteschlange übernommen.
Die internen Strukturen linearer Listen, Stapel und Warteschlangen können auf viele Arten implementiert werden. Beispielsweise könnten wir ein geordnetes Array oder eine verknüpfte Liste verwenden, um jede Struktur zu implementieren. Der entscheidende Punkt ist, dass die externe Schnittstelle immer gleich bleibt, egal wie Sie die interne Struktur implementieren. Dadurch können Sie die zugrunde liegende Implementierung ändern oder aktualisieren, ohne die öffentliche Schnittstelle zu ändern.
Java-Sammlungsarchitektur
Das Java 2 Software Development Kit (SDK) bietet neue Klassen zur Unterstützung der am häufigsten verwendeten ADTs. Diese Klassen werden Java-Sammlungsklassen genannt (ähnlich den Sammlungsklassen in MFC) und bilden zusammen die Java-Sammlungsarchitektur. Diese Sammlungsarchitektur stellt eine Reihe von Schnittstellen und Klassen bereit, die Daten als sogenannte abstrakte Sammlungsdaten darstellen.
Die java.util.Collection-Schnittstelle wird verwendet, um eine beliebige Gruppe von Objekten, also Elementen, darzustellen. Diese Schnittstelle bietet grundlegende Vorgänge wie Hinzufügen, Löschen und Abfragen. Die Collection-Schnittstelle bietet auch eine Iteratormethode. Die Iterator-Methode gibt eine Instanz der java.util.Iterator-Schnittstelle zurück. Die Iterator-Schnittstelle bietet die Methoden „hasNext“, „next“ und „remove“. Mithilfe der von der Iterator-Schnittstelle bereitgestellten Methoden können Sie die Instanzen in einem Collection-Objekt vom Anfang bis zum Ende durchlaufen und das vom Iterator (Cursor) dargestellte Element sicher löschen.
java.util.AbstractCollection ist die Basis für alle Sammlungsarchitekturklassen. Die AbstractCollection-Klasse stellt Implementierungen aller Methoden in der java.util.Collection-Schnittstelle bereit, mit Ausnahme der Iterator- und Size-Methoden. Diese beiden Ausnahmemethoden werden von allen Unterklassen implementiert, die java.util.AbstractCollection erben.
Eine Klasse, die eine Schnittstelle implementiert, muss die Implementierung aller Schnittstellenmethoden bereitstellen. Da einige Schnittstellenmethoden in der Sammlungsarchitektur optional sind, muss es eine Möglichkeit geben, den Aufrufer darüber zu informieren, dass eine bestimmte Methode nicht implementiert ist. Wenn eine optionale Methode implementiert ist und diese Methode nicht implementiert ist, wird eine UnsupportedOperationException ausgelöst. Die UnsupportedOperationException-Klasse erbt die RuntimeException-Klasse. Dadurch kann der Aufrufer alle Sammlungsvorgänge aufrufen, ohne jeden Aufruf in ein Try-Catch-Paar einzufügen.
Listen Sie die lineare Tabelle auf
Die List-Schnittstelle erbt die Collection-Schnittstelle und definiert eine geordnete Sammlung, die die Existenz identischer Elemente ermöglicht. Die List-Schnittstelle fügt außerdem Methoden hinzu, die einen numerischen Indexwert verwenden, um die Elemente in der Sammlung basierend auf der Position des Elements in der linearen Liste zu bearbeiten. Zu diesen Vorgängen gehören Hinzufügen, Abrufen, Festlegen und Entfernen.
Die List-Schnittstelle stellt auch die listIterator-Methode bereit. Diese Methode gibt eine Instanz der java.util.ListIterator-Schnittstelle zurück, die es Ihnen ermöglicht, eine lineare Liste vom Anfang bis zum Ende oder vom Ende bis zum Ende zu durchlaufen. java.util.ListIterator erbt die java.util.Iterator-Schnittstelle. Daher unterstützt es das Hinzufügen und Ändern von Elementen in der Sammlung, die es darstellt.
Das folgende Beispiel zeigt, wie die Elemente einer Liste von hinten nach vorne durchlaufen werden. Um dies zu erreichen, muss der ListIterator nach dem letzten Element der Liste positioniert werden, bevor der Durchlauf beginnt.
ListIterator iter = aList.listIterator(aList.size());
while (iter.hasPrevious())
System.out.println(iter. previous().toString());
}
Die Sammlungsarchitektur bietet zwei Implementierungen der List-Schnittstelle: LinkedList (verknüpfte Liste) und ArrayList (Array-Liste, also statische Liste). Beide Implementierungen unterstützen den wahlfreien Zugriff auf ihre Elemente. Eine ArrayList-Instanz unterstützt Vorgänge im Array-Stil und Vorgänge zur Array-Größenänderung. Eine Instanz von LinkedList bietet explizite Unterstützung für das Hinzufügen, Entfernen und Bereitstellen von Elementen am Anfang und Ende der Liste. Mit diesen neuen Methoden kann ein Programmierer einfach eine LinedList wie folgt als Stapel oder Warteschlange verwenden:
LinkedList aQueue = new LinkedList(aCollection);
aQueue.addFirst(newElement);
Objekt anElement = aQueue.removeLast();
LinkedList aStack = new LinkedList(aCollection);
aStack.addFirst(newElement);
Objekt anElement= aStack.removeFirst();
Der Codeausschnitt in Tabelle A demonstriert einige gängige Vorgänge für Implementierungsinstanzen der java.util.List-Schnittstelle unter Verwendung von java.util.ArrayList und java.util.LinkedList. Zu diesen Vorgängen gehören das Hinzufügen von Elementen, der wahlfreie Zugriff auf Elemente und das explizite Entfernen von Elementen vom Ende der Liste.
Zu wissen, was passiert, und nicht zu wissen, warum, ist von großem Nutzen
ADT bietet ein leistungsstarkes Tool zum Trennen der Vorgänge in der öffentlichen Schnittstelle eines Objekts von seiner konkreten Implementierung. Dadurch kann sich eine ADT-Implementierung ändern und weiterentwickeln, während ihre öffentliche Schnittstelle unverändert bleibt. Die Java-Sammlungsarchitektur stellt eine große Anzahl von Schnittstellen und Implementierungen bereit, die Sammlungen grundlegender Elemente darstellen und zur Erstellung nützlicher ADTs verwendet werden können.