Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage |
<< | < | > | >> | API | Kapitel 15 - Collections II |
Eine Collection vom Typ List ist eine geordnete Menge von Objekten, auf die entweder sequentiell oder über ihren Index (ihre Position in der Liste) zugegriffen werden kann. Wie bei Arrays hat das erste Element den Index 0 und das letzte den Index size() - 1. Es ist möglich, an einer beliebigen Stelle der Liste ein Element einzufügen oder zu löschen. Die weiter hinten stehenden Elemente werden dann entsprechend nach rechts bzw. links verschoben. Des weiteren gibt es Methoden, um Elemente in der Liste zu suchen.
Das Interface List ist direkt aus Collection abgeleitet und erbt somit dessen Methoden. Zusätzlich gibt es einige neue Methoden, die zum wahlfreien Zugriff auf die Elemente benötigt werden. Um Elemente in die Liste einzufügen, können die Methoden add und addAll verwendet werden:
void add(int index, Object element) boolean add(Object o) boolean addAll(Collection c) boolean addAll(int index, Collection c) |
java.util.List |
Mit add wird ein einfaches Element in die Liste eingefügt. Wenn die Methode mit einem einzelnen Object als Parameter aufgerufen wird, hängt sie das Element an das Ende der Liste an. Wird zusätzlich der Index angegeben, so wird das Element an der spezifizierten Position eingefügt und alle übrigen Elemente um eine Position nach rechts geschoben. Mit addAll kann eine komplette Collection in die Liste eingefügt werden. Auch hier können die Elemente wahlweise an das Ende angehängt oder an einer beliebigen Stelle in der Liste eingefügt werden.
Der Rückgabewert von add ist true, wenn die Liste durch den Aufruf von add verändert, also das Element hinzugefügt wurde. Er ist false, wenn die Liste nicht verändert wurde. Das kann beispielsweise dann der Fall sein, wenn die Liste keine Doubletten erlaubt und ein bereits vorhandenes Element noch einmal eingefügt werden soll. Konnte das Element dagegen aus einem anderen Grund nicht eingefügt werden, wird eine Ausnahme des Typs UnsupportedOperationException, ClassCastException oder IllegalArgumentException ausgelöst. |
|
Das Löschen von Elementen kann mit den Methoden remove, removeAll und retainAll erfolgen:
Object remove(int index) boolean remove(Object o) boolean removeAll(Collection c) boolean retainAll(Collection c) |
java.util.List |
An remove kann dabei wahlweise der Index des zu löschenden Objekts oder das Objekt selbst übergeben werden. Mit removeAll werden alle Elemente gelöscht, die auch in der als Argument übergebenen Collection enthalten sind, und retainAll löscht alle Elemente außer den in der Argument-Collection enthaltenen.
Das Interface List wird seit dem JDK 1.2 von verschiedenen Klassen implementiert:
Soll im eigenen Programm eine Liste verwendet werden, stellt sich die Frage, welche der genannten Implementierungen dafür am besten geeignet ist. Während die Klasse AbstractList nur als Basisklasse eigener Listenklassen sinnvoll verwendet werden kann, ist die Entscheidung für eine der drei übrigen Klassen von den Spezifika der jeweiligen Anwendung abhängig. Bleibt die Liste klein, wird hauptsächlich wahlfrei darauf zugegriffen; überwiegen die lesenden gegenüber den schreibenden Zugriffen deutlich, so liefert die ArrayList die besten Ergebnisse. Ist die Liste dagegen sehr groß und werden häufig Einfügungen und Löschungen vorgenommen, ist wahrscheinlich die LinkedList die bessere Wahl. Wird von mehreren Threads gleichzeitig auf die Liste zugegriffen, kann die Klasse Vector verwendet werden, denn ihre Methoden sind bereits weitgehend als synchronized deklariert. Weitere Untersuchungen zur Performance der Listentypen sind in Abschnitt 49.2.3 zu finden.
Das folgende Beispiel zeigt das Anlegen und Bearbeiten zweier unterschiedlicher Listen:
001 /* Listing1501.java */ 002 003 import java.util.*; 004 005 public class Listing1501 006 { 007 static void fillList(List list) 008 { 009 for (int i = 0; i < 10; ++i) { 010 list.add("" + i); 011 } 012 list.remove(3); 013 list.remove("5"); 014 } 015 016 static void printList(List list) 017 { 018 for (int i = 0; i < list.size(); ++i) { 019 System.out.println((String)list.get(i)); 020 } 021 System.out.println("---"); 022 } 023 024 public static void main(String[] args) 025 { 026 //Erzeugen der LinkedList 027 LinkedList list1 = new LinkedList(); 028 fillList(list1); 029 printList(list1); 030 //Erzeugen der ArrayList 031 ArrayList list2 = new ArrayList(); 032 fillList(list2); 033 printList(list2); 034 //Test von removeAll 035 list2.remove("0"); 036 list1.removeAll(list2); 037 printList(list1); 038 } 039 } |
Listing1501.java |
Hierbei wird zunächst je eine Liste des Typs LinkedList
und ArrayList
angelegt; beide werden durch Aufruf von fillList
identisch gefüllt. Der Parameter list
hat den Typ List
und akzeptiert damit beliebige Objekte, die dieses Interface implementieren.
Tatsächlich spielt es für fillList
keine Rolle, welche konkrete Listenklasse verwendet wurde, und die
nachfolgenden Ausgabemethoden geben jeweils genau dasselbe aus:
0
1
2
4
6
7
8
9
---
0
1
2
4
6
7
8
9
---
0
---
Anschließend wird aus list2 das Element "0" entfernt und dann aus list1 alle Elemente gelöscht, die noch in list2 enthalten sind. Nach dem Aufruf von removeAll verbleibt also nur noch das (zu diesem Zeitpunkt nicht mehr in list2 enthaltene) Element "0" in list1 und wird durch den folgenden Aufruf von printList ausgegeben.
Titel | Inhalt | Suchen | Index | DOC | Handbuch der Java-Programmierung, 3. Auflage, Addison Wesley, Version 3.0.1 |
<< | < | > | >> | API | © 1998-2003 Guido Krüger, http://www.javabuch.de |