Title: Das Collection-Framework von JAVA
1Das Collection-Framework von JAVA
2Aufgaben des Collection-Frameworks
- Das Collection-Framework stellt Klassen und
Interface zur Verfügung, mit deren Hilfe komplexe
Datenstrukturen verwaltet werden können. Z.B. - Listen (Duplikate möglich)
- Mengen (keine Duplikate)
- Bäume (nach einem Kriterium sortiert)
- Dabei wird streng unterschieden zwischen den
Schnittstellen zum Zugriff auf die Daten (in
Interfacen definiert) und den Methode der
Datenspeicherung (in Klassen die die Interface
implementieren).? Auf unterschiedlich
gespeicherte Daten kann in sehr ähnlicher Weise
zugegriffen werden. Vorteile - Die Datenspeicherungsart kann so gewählt werden,
dass die Arbeit möglichst effektiv realisiert
werden kann. - Die Datenspeicherungsart kann leicht geändert
werden. - Das Collection-Framework kann sowohl durch neue
Speichermethoden als auch durch neue
Zugriffsmethoden erweitert werden.
3Struktur des Collection-Frameworks
HashSet
TreeSet
ArrayList
LinkedList
LinkedHashSet
Vector
4Interface des Collection-Framworks
- Basis-Interface ist das Interface Collection
- Von Collection sind alle anderen Interface
abgeleitet. - Keine Klasse implementiert direkt das Interface
Collection. Nur die abgeleiteten Interface werden
implementiert. - In Collection sind Methoden definiert, die in
allen Implementierungen vorhanden sein müssen. - Spezifische Methoden (z.B. sortieren) sind in
abgeleiteten Interfacen (z.B. SortedSet)
definiert. - Eine Collection repräsentiert eine beliebige
Gruppe von Objekten. Das Interface wird
üblicherweise nicht implementiert, sondern nur
die daraus abgeleiteten Interface. - Jede Implementierung sollte mindestens zwei
Konstruktoren implementieren. Einen ohne
Parametere, der eine leere Collection erzeugt und
einen mit eine beliebigen Collection als
Parameter. Damit kann eine beliebige andere
umgewandelt werden.
5Methoden des Interfaces Collection
- public boolean add/remove/contains(Object o)Hinzu
fügen/Löschen/Existenztest eines Objektes - public boolean addAll/removeAll/containsAll(Collec
tion c)Hinzufügen/Löschen/Existenztest aller
Element der Collection c - public boolean retainAll(Collection c)Löschen
aller Elemente, außer der die in c enthalten sind - public void clear()leert die Collection
- public boolean isEmpty()prüft, ob die Liste leer
ist - public int size()gibt die Anzahl der Elemente
der Collection aus - public Iterator iterator()gibt einen Iterator
aus, mit dem man alle Objekte der Collection
erreichen kann
6- public Object toArray()gibt alle Elemente der
Collection in ein Feld aus - public Object toArray(Object a)das
Ergebnis-Array hat den selben Typ wie a. Es
werden nur die Elemente der Collection
ausgegeben, die zu diesem Typ passen. Passen alle
derartigen Elemente in das Feld a werden sie
darin gespeichert, sonst wird ein neues Feld
angelegt und diese ausgegeben. - addXXX, removeXXX, retainAll ergeben als Wert
true, wenn die Collection durch die Operation
verändert wurde, sonst false. - Die Methoden add, addAll, clear, remove,
removeAll und retainAll müssen nicht
implementiert werden. Sie werfen dann die
Ausnahme UnsupportedOperationException.
7Die Klasse AbstractCollection
- Die Klasse AbstractCollection implementiert die
meisten Methoden des Interfaces Collection auf
eine Standardweise. Diese kann bei der Definition
speziellerer Collections überschrieben werden. - Die Methoden iterator und size werden nicht
implementiert. Die Klasse ist daher abstract.
8Das Interface Set
- Set ist von Collection abgeleitet.
- Set beschreibt Mengen von Objekten, wobei keine
Duplikate erlaubt sind. - Die Methoden sind identisch mit denen von
Collection. - Set und Collection unterscheiden sich nur in der
Vereinbarung, dass Set keine Duplikate enthält.
9Die Klasse AbstractSet
- Die Klasse AbstractSet implementiert die Methoden
des Interfaces Set und ist abgeleitet von der
abstrakten Klasse AbstractCollection. - Die Methoden iterator und size bleiben abstract,
sodass die ganze Klasse abstract ist.
10Die Klasse HashSet
- Die Klasse HashSet ist von AbstractSet abgeleitet
und implementiert die Methoden iterator und size
auf geeignete Weise. - HashSet implementiert die einfachste Menge, d.h.
es sind keine Duplikate enthalten und die
Reihenfolge ist nicht definiert, sie kann sich
während der Nutzung ändern. - Die Elemente werden in HashMaps gespeichert.
Dadurch ist der Zugriff auf Elemente sehr schnell
(nahezu konstant bzgl. der Anzahl der Elemente).
11Implementation von HashSet
- Für jedes Element der HashSet wird ein Hash-Code
berechnet. Z.B. die Speicheradresse als
Integer-Größe. - Hash-Codes identischer Objekte sind gleich.
- Verschiedene Objekte können gleiche Hash-Codes
besitzen. - Die Elemente werden in einem Feld von einfach
verketteten Listen gespeichert. - Der Feldindex der Liste kann aus dem Hashcode
direkt berechnet werden indexhashCode
Listenanzahl - In den Listen wird dann sequentiell gesucht.
12Hashcode
13Konstruktoren
- public HashSet()erzeugt leeren HashSet
- public HashSet(Collection c)erzeugt HashSet der
alle Element der Collection c enthält - public HashSet(int initialCapacity,
float loadFactor)erzeugt leere HashSet mit
Anfangskapazität und loadFactor - public HashSet(int initialCapacity)enspricht
HashSet(initialCapacity, 0.75f) - Wenn die Anzahl der Elemente größer als
capacityloadFactor wird eine neue HashTabelle
aufgebaut, wobei capacity die aktuelle Kapazität
der HashSet ist.
14Das Interface Iterator
- Die Methode iterator des Interfaces Collection
gibt ein Objekt aus, das das Interface Iterator
implementiert. - Das Interface Iterator wird in verschiedenen
Klassen (z.B. HashMap) durch interne Klassen
implementiert. Diese Implementierungen sind aber
nicht direkt benutzbar. - Es sind also genau die Methoden nutzbar, die im
Interface definiert sind. - Methoden
- public boolean hasNext()stellt fest, ob der
nächste Aufruf von next() erfolgreich sein wird - public Object next()gibt das nächste Element des
Iterators aus. - public void remove()löscht das zuletzt mit
next() gelesene Element des Iterators, wirkt sich
auch auf die zugrunde liegende Collection aus.
15Beispiel
- Seminar mit HashSet
- import java.util.
- public class THashSet
- public static void main(String args)
-
- Collection seminar new HashSet()
- System.out.println(seminar.add(new
Student("Abu","George",1))) - ...
- System.out.println(seminar.add(new
Student("Xu","Liman",41))) - Student snew Student("Yildiz","Gülsüm",42)
- System.out.println(seminar.add(s))
- System.out.println(seminar.add(s))
- System.out.println(seminar)
- System.out.println("Azahl der Studenten
"seminar.size()) - print(seminar)
-
- public static void print(Collection col)
- Iterator it col.iterator()
- while (it.hasNext()) System.out.println(it.next(
))
16Das Interface List
- List ist von Collection abgeleitet.
- List beschreibt Collectionen, in denen die
Elemente in einer definierten Reihenfolge
gespeichert sind. Sie sind daher wie in einem
Array über einen Index erreichbar. - Der erste Index ist immer 0 (wie bei Arrays).
- Es können Duplikate in der Liste enthalten sein.
- Der Nutzer hat volle Kontrolle über die
Reihenfolge der Elemente. - Das Interface List definiert zusätzliche
Methoden, die den geforderten Eigenschaften
gerecht werden.
17Neue Methoden im Interface List
- public void add (int index, Object element)Hinzuf
ügen eines Elements an der Position index. - public boolean addAll(int index,
Collection c)Hinzufügen aller Element der
Collection c an der Position index. - public void remove(int index)Löschen des
Elements an der Position index. - public Object get(int index)Lesen des Elements
an der Position index. - public Object set(int index, Object element)Erset
zen des Elements an der Position index. - public int indexOf/lastIndexOf(Object o)Sucht
das erste/letzte Vorkommen des Elements o in der
Liste.
18- public ListIterator listIterator()Erzeugt einen
ListIterator, der alle Elemente der Liste in der
gegebenen Reihenfolge enthält. - public ListIterator listIterator(int index)Erzeug
t einen ListIterator, der alle Elemente der Liste
beginnend beim index in der gegebenen Reihenfolge
enthält. - public List subList(int fromIndex,
int toIndex)Erzeugt eine Teilliste mit den
Indizes fromIndex ... (toIndex-1). Operation auf
der Unterlistliste wirken sich auch auf die
Originalliste aus. Z.B. löscht die
Anweisunglist.subList(from, to).clear()einen
ganzen Bereich der Originalliste. - Zusätzlich zu den optionalen Methoden des
Interfaces Collection ist die Methode set
optional.
19Die Klasse AbstractList
- AbstractList ist von der Klasse
AbstractCollection abgeleitet und implementiert
das Interface List - Alle Methoden des Interfaces List außer get und
size werden implementiert. get und size bleiben
abstract. - Zusätzlich implementierte Methodeprotected void
removeRange(int fromIndex, int toIndex)löscht
alle Elemente von fromIndex bis (toIndex-1)
20Die Klasse ArrayList
- ArrayList ist von AbstractList abgeleitet und
implementiert die Methode size. - Die Klasse ArrayList stellt ein Array zur
Verfügung, das genau so effektive Zugriffe
erlaubt, wie das normale Array, aber automatisch
wächst. Außerdem können Elemente eingefügt werden.
21Implementation von ArrayList
- Die Elemente werden in einem Object
gespeichert. - Zum Kopieren des Feldes bei Änderungen wird die
Methode System.arraycopy verwendet.
22Konstruktoren von ArrayList
- public ArrayList()
- public ArrayList(Collection c)
- public ArrayList(int initialCapacity)erzeugt
eine ArrayList mit der Kapazität initalCapacity
23Methoden von ArrayList
- public void ensureCapacity(int minCapacity)erhöht
dir Kapazität des Feldes, so dass mindestens
minCapacity Elemente gespeichert werden können. - public void trimToSize()Verkleinert das Feld so,
dass kein unnötiger Speicherplatz benötigt wir.
24Das Interface ListIterator
- Das Intefrace ListIterator vom Interface Iterator
abgeleitet und dem Zugriff auf die Elemente einer
Collection. - Dabei werden zusätzliche Methoden definiert, wie
sie zum Zugriff auf Listen zweckmäßig sind. - Zusätzliche Methoden
- public boolean hasPrevious()stellt fest, ob der
nächste Aufruf von previous() erfolgreich sein
wird - public Object previous()gibt das vorhergende
Element des Iterators aus - public int nextIndex()bestimmt den Index des
nächsten Listenelements - public int previousIndex()bestimmet den Index
des vorhergehenden Listenelements - public void add(Object o)fügt ein Listenelement
hinzu - public void set(Object o)ersetzt ein
Listenelement
25Beispiel
- Seminar mit TreeList
- Einzige ÄnderungCollection seminar new
ArrayList() - Resultat
- Duplikate werden gespeichert.
- Die Daten behalten die Reihenfolge der
Speicherung. - Wenn die zusätzlichen Listen-Möglichkeiten
genutzt werden sollen muss folgende Änderung
vorgenommen werdenList seminar new
ArrayList() - Dann kann die List auch rückwärts gelesen werden
und es können Element hinzugefügt werden.
26Die Klasse AbstractSequentialList
- Die Klasse AbstractSequentialList ist von
AbstractList abgeleitet. Die Methode listIterator
ist nicht implementiert. - AbstractSequentialList ist für Listen gedacht,
die ausschließlich sequentiell bearbeitet werden
sollen (z.B. LinkedList). Dabei kann die Liste
vorwärts und rückwärts durchlaufen werden. - Zusätzliche Mehodepublic abstract ListIterator
listIterator(int index)erzeugt einen
ListIterator, der die Element beginnend mit dem
Index index enthält.
27Die Klasse LinkedList
- Die Klasse LinkedList ist von der Klasse
AbstractSequentialList abgeleitet. - LinkedList stellt eine Liste zur Verfügung, die
hauptsächlich sequentiell verarbeitet werden
kann. - Der Zugriff über index ist möglich, aber sehr
uneffektiv. - Änderungen der Liste erfordern kein Umkopieren,
wie bei ArrayList. - LinkedList ist also für Listen geeignet,
- deren Größe häufig wechselt,
- wo Element häufig gelöscht bzw. hinzugefügt
werden, - die Elemente sequentiell bearbeitet werden.
28Implementierung von LinkedList
- Die Liste wird als doppelt zyklisch verkettete
Liste gespeichert. Dadurch kann vorwärts und
rückwärts zugegriffen werden. - Es existieren Anfang und Ende der Liste.
29Konstruktoren und Methoden von LinkedList
- Konstruktoren
- public LinkedList()
- public LinkedList(Collection c)
- Zusätzliche Methoden
- public void addFirst/ addLast(Object o)Hinzufügen
am Anfang/Ende der Liste - public Object getFirst/ getLast()Lesen des
ersten/letzten Listenelements - public Object removeFirst/ removeLast()Löschen
des ersten/letzten Listenelements
30Beispiel
- Seminar als LinkedList
- Einzige erforderliche ÄnderungCollection
seminar new LinkedList() - Falls man Zugriff auf spezielle Methoden der
LinkedList benötigt, muss manLinkedList seminar
new LinkedList()nutzen.
31Das Interface SortedSet
- Das Interface SortedSet ist vom Interface Set
abgeleitet. - SortedSet stellt einen Set zur Verfügung in dem
Elemente sortiert gespeichert werden. - Dazu müssen die Elemente eine natürliche Ordnung
besitzen, d.h. es läßt sich eindeutig entscheiden
ob ein Element größer oder kleiner als ein
anderes Element ist oder ob beide gleich sind. - Dazu können sie das Interface Comparable
implementieren oder sie lassen sich mit dem zum
SortedSet gehörigen Comparator vergleichen. - Die Teilmengen-Methoden (headSet, tailSet,
subSet) liefern Sichten auf die Menge, d.h.
Änderungen in den Teilmengen wirken sich auch auf
die eigentliche Menge aus.
32Methoden in SortedSet
- public Comparator comparator()gibt den
Comparator aus - public Object first/last()gibt das
kleinste/größte Element der Menge aus - public SortedSet headSet/tailSet(Object element)g
ibt die Teilmenge der Menge aus, die alle Element
enthält die kleiner/nicht kleiner als element
sind - public SortedSet subSet(Object fromElement,
Object toElement)gibt die Teilmenge der Menge
aus, die alle Element enthält die nicht kleiner
als fromElement und kleiner als toElement sind
33Das Interface Comparable
- Das Interface Comparable definiert genau eine
Methodepublic int compareTo(Object o)der Wert
ist kleiner, gleich bzw. größer 0 wenn das Objekt
kleiner, gleich bzw. größer o ist - Die Implementierung muss folgende Bedingungen
erfüllen - sgn(x.compareTo(y)) -sgn(y.compareTo(x))
- Transitivität x.compareTo(y)gt0
y.compareTo(z)gt0 ? x.compareTo(z)gt0 - x.compareTo(y)0 ? sgn(x.compareTo(z))
sgn(y.compareTo(z))
34Beispiel Student
public class Student implements
Comparable String nachName "" String
vorName "" long matrikelNummer
-1 ... public int compareTo(Object o) return
(int)(matrikelNummer-((Student)o).matrikelNummer)
...
35Das Interface Comparator
- Definiert folgende Methodepublic int
compare(Object o1, Object o2)vergleicht die
Objekte o1 und o2 miteinander. Die zu erfüllenden
Bedingungen entsprechen denen von
Comparable.compareTo .
36Beispiel StudentCompare
import java.util. public class StudentCompare
implements Comparator public int
compare(Object o1, Object o2) return
(int)( ((Student)o1).matrikelNummer- ((Student)o
2).matrikelNummer)
37Die Klasse TreeSet
- Die Klasse TreeSet ist abgeleitet von AbstractSet
und implementiert das Interface SortedSet. - Es wird eine Menge (keine Duplikate)
bereitgestellt, deren Elemente entsprechend einer
vorgegebenen Ordnung sortiert sind. - Die Ordnung bleibt jederzeit erhalten.
- Durch die Speicherungsart ist das Einfügen,
Löschen und Suchen von Elementen sehr schnell
(O(ln n)).
38Implementierung von TreeSet
- TreeSet wird als binärer Baum implementiert.