Die Java Collection API

Werbung
Java Schulung
Objektorientierte Programmierung in Java
Teil V: Die Java Collection Klassen
Prof. Dr. Nikolaus Wulff
Collections in Java 2
Java 2 Collections:
http://java.sun.com/products/jdk/1.2/docs/guide/collections/index.html
[Offizielle Dokumentationen zum Thema Collections in Java 2]
Java 2 Collections Tutorial Online:
http://java.sun.com/docs/books/tutorial/collections/index.html
[Einführung in die Verwendung der Collection-Klassen in Java 2]
David Flanagan: Java in a Nutshell.
2nd Edition, O‘Reilly, 1997, ISBN 1-56592-262-x.
[Der Java-Nachschlage-Klassiker. Kurz und knapp durch die wesentlichen
Java-Bestandteile und -Packages.]
Prof. Dr. Nikolaus Wulff
2
java.util.Collection
Eine Collection ist ein Objekt, das eine Gruppe
von anderen Objekten zusammenfaßt.
Collections werden verwendet um andere Objekte
zu speichern, zu manipulieren und Mengen von
Objekten von einer Operation an eine andere
weiterzugeben.
Collections enthalten i.d.R. Objekte vom selben
Typ: eine Menge von Briefen, eine Menge von
Telefonnummern mit Namen etc.
•
Prof. Dr. Nikolaus Wulff
Items
•
•
Collection
•
•
....
3
Fachliche und technische Behälter
Sparbuch
_saldo
gibSaldo
_kontobewegungen
•
gibAnzahl
Fachliche Behälter implementieren ein
Konzept der Anwendungsgebiets.
Es sind Gegenstände, die der
Anwender bei seiner Arbeit einsetzt
und für die sich ein typischer
Umgang etabliert hat.
Technische Behälter werden als
interne Repräsentation fachlicher
Behälter verwendet.
gibBewegungenVom(12.1.2000) Fachliche Behälter stehen daher zu
technischen Behältern in einer
Benutzt-Beziehung.
•
Items
•
•
•
•
....
Technische Behälter sollten wie fachliche Behälter nach ihrem Umgang
modelliert und klassifiziert werden.
Für technische Behälter haben sich
typische informatische Arten des
Umgang herausgebildet (Stack,
Queue, List, Set, Map).
Collection
Prof. Dr. Nikolaus Wulff
4
Collections in Java 2
Collection ist die Wurzel
der Collection-Hierarchie.
Für Collection gibt es
keine Implementation.
Dieses Interface wird verwendet, wenn eine Menge
von Objekten so generell
wie möglich verwendet
werden soll.
Ein Set ist eine Menge,
die keine Duplikate
enthalten kann.
In einem SortedSet
sind die Objekt in
aufsteigender
Reihenfolge sortiert
enthalten.
Prof. Dr. Nikolaus Wulff
Eine Map ist ein Objekt, das Schlüssel
und Werte Paar enthält. Jeder Schlüssel
kann nur einmal vorkommen.
In einer
SortedMap
sind die Objekt
in aufsteigender
Reihenfolge der
Schlüssel
sortiert.
Eine List enthält ihre Objekte in einer
geordneten Reihenfolge, die vom Benutzer
der Liste festgelegt wird. Duplikate sind
möglich. Listenelemente können über einen
Index angesprochen werden.
Package java.util
5
Implementationsvarianten
Für Set, List und Map gibt es jeweils zwei Implementationsvarianten. Die zwei
Variante zum selben Interface haben jeweils spezifische Vor- und Nachteile und
sollten je nach Verwendungszusammenhang ausgewählt werden.
Für SortedSet und SortedMap existiert jeweils nur eine Implementation, nämlich
TreeSet und TreeMap.
Hash Table
Set
List
Map
Resizable Array
HashSet
Balanced Tree
TreeSet
ArrayList
HashMap
Linked List
LinkedList
TreeMap
List l1 = new ArrayList();
List l2 = new LinkedList();
Map m1 = new HashMap();
Prof. Dr. Nikolaus Wulff
6
Das Interface Collection
public interface Collection {
// Basic Operations
int
size();
boolean isEmpty();
boolean contains(Object element);
boolean add(Object element);
boolean remove(Object element);
Iterator iterator();
Sei
tJ
DK
1.5
s
Gen tatt O werd
en
b
eric
s ve ject
rwe
nde
t
// Bulk Operations
boolean containsAll(Collection c);
boolean addAll(Collection c);
boolean removeAll(Collection c);
boolean retainAll(Collection c);
void
clear();
interface Collection<T> {
// Basic Operations
boolean add(T element);
// Array Operations
boolean remove(Object element);
Object[] toArray();
Object[] toArray(Object a[]); Iterator<T> iterator();
}
Prof. Dr. Nikolaus Wulff
7
Das Interface Map
public interface Map {
// Basic Operations
int
size();
boolean
isEmpty();
boolean
containsKey(Object key);
boolean
containsValue(Object value);
Object
put(Object key, Object element);
Object
get(Object get);
Object
remove(Object key);
Set
keySet();
Collection values();
Sei
tJ
DK
1.5
s
Gen tatt O werd
en
b
e ri c
s ve ject
rwe
n de
t
// Bulk Operations
void
putAll(Map map);
void
clear();
}
Prof. Dr. Nikolaus Wulff
8
Der Iterator
public interface Iterator {
boolean hasNext();
Object next();
void remove();
// Optional
}
Collection c = new LinkedList();
...
Konto k;
Iterator i = c.iterator();
while (i.hasNext())
{
k = (Konto)i.next();
if (k.gibSaldo < 100000)
i.remove();
}
Prof. Dr. Nikolaus Wulff
Ein Iterator-Objekt
erlaubt es, den Inhalt
einer Collection zu
durchlaufen und auch
Elemente zu löschen.
Polymorphie
Das Durchlaufen einer
Collection kann auf
jedem Objekt ausgeführt
werden, dessen Klasse
von Collection erbt.
Egal welche
Implementationsvariante
vorliegt. Voraussetzung
ist, daß das Löschen
von Elementen in der
verwendeten Variante
unterstützt wird.
9
Enumeration
Die Collection Klassen wurden mit dem JDK1.2 generell
überarbeitet und erweitert.
Die alten Collections (Vector, Hashtable) verwenden statt des
Iterators eine Enumeration. Diese macht im Prinzip das
selbe nur mit einer etwas anderen Syntax:
Vector v = new Vector();
...
Enumeration e = v.elements();
while (e.hasMoreElements()) {
Object o = e.nextElement()
...
}
Prof. Dr. Nikolaus Wulff
Collection c = new ArrayList();
...
Iterator i = c.iterator();
while (i.hasNext()) {
Object o = i.next();
...
}
10
Array-Operationen
Mit den Collection.toArray-Operationen kann der Inhalt einer Collection in
einen Array überführt werden.
Mit Arrays.asList können Arrays in Listen konvertiert werden.
public interface Collection {
Object[] toArray();
}
Ein neues Array-Objekt wird erzeugt und mit den Elementen der Collection gefüllt.
Collection c = new LinkedList();
Object[] a = c.toArray();
public interface Collection {
Object[] toArray(Object a[]);
}
Ein neues Array-Objekt wird erzeugt und mit den Elementen der Collection gefüllt.
Wenn die Länge 0 ist, wird ein neues Array mit dem angegebenen Typ mit
ausreichender Größe erzeugt.
Collection c = new LinkedList();
String[] a = (String[]) c.toArray(new String[0]);
Prof. Dr. Nikolaus Wulff
11
Java Generics
Seit dem JDK1.5 enthält Java Generics/Templates.
Diese beinhalten insbesondere typesichere Collections
und Maps.
Templates werden mit einem „Platzhalter“ <T> für den
generischen Typen T definiert.
Verwendet werden sie dann zur Compilezeit mit einem
explizit angegeben Typen.
Beispiel:
ArrayList<T>, Collection<T>, Iterator<T>
ArrayList<Money>, Collection<Money>, Iterator<Money>...
Prof. Dr. Nikolaus Wulff
12
Collection ohne Generics
Ohne Generics müssen Iterator und Collections immer
auf den passenden Typ gecasted werden:
Collection saldo = new ArrayList();
public void addMoney(Money m) {
saldo.add(m);
}
public void printMoney() {
Iterator moneyIterator = saldo.iterator();
while(moneyIterator.hasNext()) {
Money m = (Money) moneyIterator.next();
print(m);
}
}
Prof. Dr. Nikolaus Wulff
13
Collection mit Generics
Mit Generics entfällt das Casten, die Collection
akzeptiert nur den „richtigen Typ“ und liefert diesen
auch ohne Cast zurück:
Collection<Money> saldo = new ArrayList<Money>();
public void addMoney(Money m) {
saldo.add(m);
}
public void printMoney() {
Iterator<Money> moneyIterator = saldo.iterator();
while(moneyIterator.hasNext()) {
Money m = moneyIterator.next();
print(m);
Kein Cast mehr
}
} Nikolaus Wulff
Prof. Dr.
14
For-each Schleife
Zusätzlich zu den Generics ist es möglich vereinfachte
for-each Schleifen zu schreiben.
Statt:
Iterator<Money> moneyIterator = saldo.iterator();
while(moneyIterator.hasNext()) {
Money m = moneyIterator.next();
print(m);
}
Jetzt:
for(Money m : saldo) {
print(m);
}
Prof. Dr. Nikolaus Wulff
15
Übung
Server
Client
<<uses>>
addService(service : Service) : void
getService(name : String) : Service
ServerException
throws
name : String
service
0..1
<<Interface>>
Service
doTask(req : Request, res : Response) : void
getName() : String
Wir implementieren einen Server, der beliebige Services
zur Verfügung stellt.
Diese Services lassen sich hinzufügen und per Namen
referenzieren mit den Operationen addService
und getService
Prof. Dr. Nikolaus Wulff
16
Hinweis
Wir wissen so gut wie nichts über die angebotenen Dienste
(Services), das irritiert zunächst...
Für die gestellte Aufgabe des Servers (Verwalten von
Services) spielt dies jedoch keine Rolle!
Mit welcher Collection Klasse werden die Services am besten
verwaltet?
Um die Funktionalität unseres Servers zu über-prüfen
verwenden wir einen JUnit Test als Client.
Frage: Was muss getestet werden, wo bekommen wir einen
Service her?
Prof. Dr. Nikolaus Wulff
17
Hinweis: Klassendiagramm
TestCase
(from j unit.framew ork)
ServerTest
Server
server
testAddService()
testGetService()
1
addService()
getService()
name : String
<<inner class>>
1
DummyService
service
0..1
<<Int erface>>
Service
DummyService ist ein JUnit Mock Objekt, das die Service Schnittstelle
implementiert.
Wir verwenden eine innere Klasse, da sie nur innerhalb des Kontext des
Tests Sinn macht.
Prof. Dr. Nikolaus Wulff
18
Herunterladen