Sie sind auf Seite 1von 20

Collection-Framework

Arrays (Felder)
• haben eine feste Länge, die bei der Erzeugung festgelegt wird und nicht
mehr verändert werden kann.
a = new int[5];

• Oft benötigt man aber „Behälter“, die dynamisch wachsen können

length
a 3

0 0 0

a[0] a[1] a[2]

Tran / Hettel GDI 2 1


Collection-Framework

Typische Anforderung an eine Behälter-Datenstruktur


• Hinzufügen / Löschen eines Objekts
• Suchen nach einem Objekt
• Frage nach der Anzahl der Elemente
• Durchlaufen durch die Datenstruktur
• Sortieren der Elemente

Wichtige Fragestellungen
• Sind Duplikate erlaubt/nicht erlaubt?
• Sollen die Elemente sortiert werden?
• Werden die Behälter häufig geändert?
• Sind konkurrierende Zugriffe erlaubt? (=> siehe Vorlesung Nebenläufige
Programmierung)

Tran / Hettel GDI 2 2


Collection-Framework

Das Java Collection-Framework stellt eine Bibliothek zur Verfügung, die viele
häufig benötigte ,,Container“ (Datenstrukturen) beinhaltet.
• Alle Methoden, die man bei der Benutzung des Collection-Frameworks
verwendet, sind in Interfaces (Sammlung von Dienste – Siehe später) im Paket
java.util definiert. Für unterschiedliche Datenstrukturen stehen verschiedene
Interfaces zur Verfügung.

Tran / Hettel GDI 2 3


Design des Collection-Framework

Die Implementierungshierarchie (Auszug)

Tran / Hettel GDI 2 4


Umgang mit dem Collection-Framework

Listen – Geordnete Datenbehälter


–Interface: List
–Implementierungen: ArrayList, LinkedList

List<String> myList = new ArrayList<>();

myList.add("abc");
myList.add("lmn");
myList.add("xyz"); List<String> myList = new LinkedList<>();

for(String str : myList ) myList.add("abc");


System.out.println( str ); myList.add("lmn");
myList.add("xyz");

for(String str : myList )


System.out.println( str );

Tran / Hettel GDI 2 5


Umgang mit dem Collection-Framework

Listen
• Listenerzeugung
+ArrayList() Erzeugung einer leeren Array-Liste mit einer Standardkapazität
+ArrayList(int cap) Erzeugung einer leeren Array-Liste mit der angegebenen Kapazität
+ArrayList(Collection<? extends E> c) Erzeugung einer Array-Liste mit den Elementen
von c.
+LinkedList() Erzeugung einer leeren, verketteten Liste.
+LinkedList(Collection<? extends E> c) Erzeugung einer verketteten Liste mit den
Elementen von c.

Eine beliebte Methode, um eine Liste aus einem Array von Objekten zu erhalten,
ist die Methode java.util.Arrays.asList:
static List<T> asList(T...)

Tran / Hettel GDI 2 6


Umgang mit dem Collection-Framework

• Listenerzeugung - Beispiele
public static void main(String[] args)
{
// Array-Liste
List<String> txtArrayListe = new ArrayList<>();
txtArrayListe.add("Test");
// Verkettete Liste
List<Integer> a = new LinkedList<>();
// a.add(1); a.add(2);
// Liste aus einem Array von Objekten
List<Integer> b = java.util.Arrays.asList(new Integer[]{1,2});
// Aus einem Array von primitiven Daten muss man
// über Schleife gehen - Beachte, dass Autoboxing (elem wird
// automatisch zu einem Integer-Objekt umgewandelt) stattfindet
int[] vorlage = {1,2,3};
for (int elem: vorlage)
a.add(elem); // a.add(Integer.valueOf(elem));
}

Tran / Hettel GDI 2 7


Umgang mit dem Collection-Framework

Collection – Gängige Methoden


+boolean add(E obj) – versucht, Referenz auf ein Objekt einzufügen
+boolean addAll(Collection<? extends E> c) – versucht, alle Elemente der gegebenen
Collection einzufügen. true wird zurückgeliefert, wenn mindestens ein
Element eingefügt wurde.
+void clear() – entfernt aller Elemente aus der Collection .
+boolean contains(Object obj) – prüft, ob obj in der Collection enthalten ist.
+boolean containsAll(Collection<?> c) – prüft, ob c ein Teil der Collection ist.
+boolean isEmpty() – prüft, ob Collection leer ist.
+Iterator<E> iterator() – liefert einen Iterator über die Collection.
+boolean remove(Object obj) – versucht, das Element zu entfernen.

Tran / Hettel GDI 2 8


Umgang mit dem Collection-Framework

Iterationen – Durchlaufen einer Collection


–Über Collections kann einheitlich iteriert werden

List<String> myList = new LinkedList<>();

myList.add("abc");
myList.add("lmn");
myList.add("xyz");

// Variante 1
for(String str : myList )
System.out.println( str );

// Variante 2
Iterator<String> itr = myList.iterator();
while( itr.hasNext() )
{
String str = itr.next();
System.out.println( str );
}

Tran / Hettel GDI 2 9


Umgang mit dem Collection-Framework

Collection – Gängige Methoden


+boolean removeAll(Collection<?> c) – versucht, alle Elemente aus c zu entfernen. true
wird zurückgeliefert, falls mindestens ein Element entfernt wurde.
+boolean retainAll(Collection<?> c) – versucht, alle Elemente zu entfernen, die nicht in
der angegebenen Collection enthalten sind.
+int size()
+Object[] toArray() – liefert alle Elemente der Collection als Array von Object.

Tran / Hettel GDI 2 10


Umgang mit dem Collection-Framework

Eine List<E> erweitert Collection<E> und haben weitere Methoden:


+void add(int idx, E obj) – fügt das Element an der spezifizierten Position ein.
+E get(int idx) – liefert das Element an der spezifizierten Position.
+int indexOf(Object obj) – sucht nach dem ersten Vorkommen des Elements.
+int lastIndexOf(Object obj) – sucht nach dem letzten Vorkommen des Elements.
+E remove(int idx) – löscht und liefert das Element an der Position idx zurück.
+E set(int idx, E obj) – ersetzt das Objekt an der Position idx und liefert das ersetzte
Objekt zurück.

Tran / Hettel GDI 2 11


Umgang mit dem Collection-Framework

• Operationen auf ArrayList und LinkedList:

a) Hinzugefügtes Element Hinzugefügtes Element

b)

Eingefügtes Element Eingefügtes Element

Tran / Hettel GDI 2 12


Umgang mit dem Collection-Framework

Vergleich der einzelnen Operationen (Laufzeitkomplexität):

Tran / Hettel GDI 2 13


Umgang mit dem Collection-Framework

Mengen – Ungeordnete Datenbehälter (Duplikate sind nicht erlaubt)


• Interface: Set
• Implementierungen: HashSet, TreeSet, ...
Set<String> mySet = new HashSet<>();

mySet.add("ABC");
mySet.add("XYZ");

for(String str : mySet )


{
System.out.println( str );
}

Tran / Hettel GDI 2 14


Umgang mit dem Collection-Framework

Arbeitsweise einer HashSet

"music"
hash code: 104263205 → array index: 2
"beer"
hash code: 3019824 → array index: 5
"afterlife"
hash code: 1019963096 → array index: 9
"wisdom"
hash code: -787603007 → array index: 4
"politics"
hash code: 547400545 → array index: 10
"theater"
hash code: -1350043631 → array index: 2
"schools"
hash code: 1917457279 → array index: 1
"painting"
hash code: 925981380 → array index: 5
"fear"
hash code: 3138864 → array index: 3

Tran / Hettel GDI 2 15


Umgang mit dem Collection-Framework

Vergleich der einzelnen Operationen (Laufzeitkomplexität):


h entspricht der Kapazität der Hash-Tabelle.
In der Praxis häufig: HashSet bzw. TreeSet, falls eine Sortierung erwünscht ist.

Tran / Hettel GDI 2 16


Umgang mit dem Collection-Framework

Assoziative Mengen (Zuordnung/Abbildung)


• Interface: Map
• Implementierungen: HashMap, TreeMap, ...
Map<String, Integer> myMap = new HashMap<>();

myMap.put("ABC" , 5);
myMap.put("XYZ", 17);

for(String str : myMap.keySet() )


{
System.out.println( str + " -> " + myMap.get(str) );
}

Tran / Hettel GDI 2 17


Umgang mit dem Collection-Framework

Map – gängige Methoden


+void clear() – entfernt alle Einträge aus der Tabelle.
+boolean containsKey(Object key) – prüft, ob das Element ein Schlüssel in der Tabelle
ist.
+boolean containsValue(Object key) – prüft, ob das Element ein Wert in der Tabelle ist.
+V get(Object key) – liefert den Wert zu dem gegebenen Schlüssel.
+boolean isEmpty() – prüft, ob die Tabelle leer ist.
+Set<K> keySet() – liefert aller Schlüssel der Tabelle als Set.
+V put(K key, V value) – fügt einen neuen Eintrag in die Tabelle ein. Der alten Wert
(oder null) wird zurückgegeben.
+V remove(Object key) – löscht das Element zu dem Schlüssel key.
+int size()
+Collection<V> values() – liefert alle Werte der Tabelle als Collection.

Tran / Hettel GDI 2 18


Umgang mit dem Collection-Framework

Arbeitsweise einer HashMap


Hash-Bereich von Key x

0 1 2 3 4

Tran / Hettel GDI 2 19


Umgang mit dem Collection-Framework

Vergleich der einzelnen Operationen (Laufzeitkomplexität):


h entspricht der Kapazität der Hash-Tabelle

Tran / Hettel GDI 2 20