Kapitel 14. Das Java Collection Interface. Fachgebiet Knowledge Engineering Prof. Dr. Johannes Fürnkranz

Ähnliche Dokumente
4.4.9 Das Java Collection Framework

JAVA KURS COLLECTION

Einführung in die Programmiersprache Java III

Grundkonzepte java.util.list

Programmiertechnik II

Propädeutikum Programmierung in der Bioinformatik

Programmiertechnik II

Teil V. Generics und Kollektionen in Java

Objektorientierte Programmierung. Kapitel 21: Einführung in die Collection Klassen

Programmierkurs Java

Programmiertechnik II

19 Collections Framework

12 Collections Framework. Interfaces Maps and Collections. Collection Interface. Überblick. Collection = Containterklasse, die andere Objekte enthält.

Programmierkurs Java

OCP Java SE 8. Collections

19 Collections Framework

Kapitel 4: Bäume i. 1. Einleitung. 2. Ein Datenmodell für Listen. 3. Doppelt-verkettete Listen. 4. Bäume. 5. Das Collections-Framework in Java

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

ADT: Java Collections und ArrayList

java.util. Sebastian Draack Department Informations- und Elektrotechnik Department Informations- und Elektrotechnik JAVA Collection-API

Einstieg in die Informatik mit Java

Objektorientiertes Programmieren mit Java

Java Schulung. Objektorientierte Programmierung in Java Teil V: Die Java Collection Klassen. Prof. Dr. Nikolaus Wulff

Mengen und Multimengen

Nützliche Utility-Klassen des JDK

Java Einführung Collections

1. Welches Interface ist nicht von Collection abgeleitet? A. B. C. D. List Set Map SortedSet. 2. Welche Aussagen sind richtig?

Wo sind wir? Rudolf Berrendorf FH Bonn-Rhein-Sieg Programmiersprache Java 338

Kapitel 6: Java Collection Teil I

Abstrakte Datentypen und Java

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Faulheit professionell: Fertige Datenbehälter. Das Java-Collections-Framework Typsicherheit Generische Klassen

Kapitel 12: Java Collection Teil II

Kapitel 12: Java Collection Teil II

Java Collections Framework (JCF)

Kapitel 7: Java Collection Teil I

Info B VL 14: Java Collections/Reflections

> Datenstrukturen in Java (Teil 2)

Schein-/Bachelorklausur Teil 2 am Zulassung: Mindestens 14 Punkte in Teilklausur 1 und 50% der Übungspunkte aus dem 2. Übungsblock.

Mengen und Multimengen

Vorlesung Programmieren

Hashmap: Video Erklärung

Programmieren in Java

Collections. Arthur Zaczek. Nov 2015

Kapitel 5: Iterierbare Container

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 15/16. Kapitel 12. Listen. Listen 1

Collections des Typs Set. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 09: Collections 3. Collections des Typs Set.

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

IT I: Heute. abstrakte Methoden und Klassen. Interfaces. Interfaces List, Set und Collection IT I - VO 7 1

II.4.4 Exceptions - 1 -

Heute. Nachbetrachtung Wissensüberprüfung. Sortieren Interface Comparable TreeSet Sortieren von Arrays: Arrays.sort() 3.12.

Allgemeine Informatik II

II.4.6 Collections - 1 -

Programmieren 2 16 Java Collections und Generizität

Aufgabenblatt 4. Aufgabe 3. Aufgabe 1. Aufgabe 2. Prof. Dr. Th. Letschert Algorithmen und Datenstrukturen

Lineare Datenstrukturen: Felder, Vektoren, Listen Modelle: math. Folge (a i ) i=1.. mit Basistyp T oder: [T]

Objektorientierte Implementierung

Collections. Arthur Zaczek

17. Java Collections. Daten Organisieren. Generische Liste in Java: java.util.list. Typ Parameter (,,Parametrischer Polymorphisums )

Kapitel 5: Interfaces

Sammlungen Listen Mengen Abbildungen Algorithmen Wrapper

Java Generics & Collections

Einführung in die Programmierung mit Java

Collections und Iteratoren ListIterator Sets. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 22

Programmieren II. Hierarchie von Collections. Vorlesung 3. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester 2010

Wie kann man es verhindern das Rad immer wieder erneut erfinden zu müssen?

Vorlesung Programmieren

Programmierzertifikat Objekt-Orientierte Programmierung mit Java

Programmieren in Java

Java I Vorlesung Collections

Dynamische Datenstrukturen

Programmieren in Java

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 4 ArrayList, PriorityQueue, HashSet und HashMap

equals und hashcode SortedSet NavigableSet Assoziative Container Programmieren II Dr. Klaus Höppner Hochschule Darmstadt Sommersemester / 32

Teil II) Objektorientierte Implementierung 10) Verfeinern von UML-Assoziationen mit dem Java-2 Collection Framework

Übungsblatt Programmierung und Software-Entwicklung Generizität, Interfaces, Listen, Sortieralgorithmen & JUnit

Javakurs für Fortgeschrittene

Programmieren II. Datenstrukturen / Das Collection-Framework. Heusch 14 Ratz Institut für Angewandte Informatik

Software Entwicklung 1

Programmieren in Java

IT I: Heute. Klasse Object. equals, hashcode, tostring. HashSet IT I - VO 6 1

Programmieren in Java

Programmieren I. Kapitel 13. Listen

2.4. Java Collections Framework

Programmierkurs Java

ALP II Dynamische Datenmengen

Programmieren II. Datenstrukturen / Das Collection-Framework. Heusch 14 Ratz Institut für Angewandte Informatik

Vorlesung 07: Collections. Peter Thiemann SS 2010

7. Verkettete Strukturen: Listen

Schwerpunkte. Verkettete Listen. Verkettete Listen: 7. Verkettete Strukturen: Listen. Überblick und Grundprinzip. Vergleich: Arrays verkettete Listen

Institut für Informatik

Aufgabe11. Methode test1. import java.util.hashmap; import java.util.arraylist; public class Aufgabe11 {

Listen. Prof. Dr. Christian Böhm. in Zusammenarbeit mit Gefei Zhang. WS 07/08

Transkript:

Kapitel 14 Das Java Collection Interface

14. Das Java Collection Interface 1. Collections 2. Iteratoren (Iterators) 3. Listen (List) 4. Mengen (Set) 5. Hashtabellen (Map) 6. Generics Folie 14.2

Das Java Collection Framework eine Sammlung von Interfaces, die die Organisation von Objekten in Container unterstützt http://java.sun.com/j2se/1.4.2/docs/api/java/util/collection.html Spezifikation von Methoden zur Unterstützung der Erstellung von Collections Hinzufügen und Löschen von Objekten, etc. Die wichtigsten Container-Interfaces: Folie 14.3

Die wichtigsten Elemente java.util.collection Interface, um eine Gruppe von Objekten zu organisieren Basis-Definitionen für Hinzufügen und Entfernen von Objekten java.util.list Collection Interface, das zusätzlich jedem Element eine fixe Position zuweist java.util.set Collection Interface, das keine doppelten Elemente erlaubt (Mengen) java.util.map Interface, das die Zuordnung von Elementen zu sogenannten Schlüsseln unterstützt erlaubt, Elemente mit dem zugehörigen Schlüssel anzusprechen Map ist keine Unterklasse von Collection! Folie 14.4

Nützliche Hilfs-Interfaces java.util.iterator Interface, das Methoden spezifiziert, die es erlauben, alle Elemente einer Collection aufzuzählen ersetzt weitgehend das ältere java.util.enumeration Interface java.util.comparator Interface, das Methoden zum Vergleich von Elementen einer Collection spezifiziert Folie 14.5

Wichtige Methoden des Collection Interfaces boolean add(object obj) füge obj zur Collection hinzu return true wenn sich die Collection dadurch verändert hat boolean contains(object obj) return true wenn obj bereits enthalten ist boolean isempty() return true wenn die Collection keine Elemente enthält Iterator iterator() return ein Iterator Objekt, mit dem man die Elemente einer Collection auf zählen kann boolean remove(object obj) entfernt ein Element, das equal zu obj ist, falls eins existiert return true, falls sich die Collection dadurch verändert hat int size() return die Anzahl der Elemente in der Collection Folie 14.6

Weitere Methoden des Collection Interface boolean addall(collection c) fügt zur Collection alle Objekte aus der Collection c hinzu boolean containsall(collection c) true wenn alle Objekte aus der Collection c enthalten sind boolean removeall(collection c) entfernt alle Objekte aus der Collection, die sich in einer anderen Collection c befinden boolean retainall(collection c) behalte nur Objekte, die sich auch in der Collection c befinden void clear() entfernt alle Objekte aus der Collection Object[] toarray() retourniert die Elemente der Collection in einem Array Object[] toarray(object[] a) retourniert einen Array vom selbem (dynamischen) Typ wie a Folie 14.7

java.util.iterator Das Iterator Interface dient zur Iteration über Elemente einer Collection kann aber auch von anderen Klassen implementiert werden Festgelegte Methoden: boolean hasnext() überprüft, ob die Collection noch zusätzliche Elemente hat Object next() retourniert das nächste Objekt in der Collection void remove() entfernt das letzte Element, das vom Iterator retourniert wurde, aus der Collection Anmerkung: seit der Java Version 1.5. gibt es auch eine spezielle Version der for-schleife zur Iteration über eine Collection Folie 14.8

Beispiel 1 Das Programmstück aus dem letzten Beispiel von Kapitel 12 könnte man auch so schreiben oder so for ( int i=0; i<v.size(); i++ ) { Integer x = (Integer)(v.get(i)); System.out.print ( x.intvalue() ); } Iterator it = v.iterator(); while (it.hasnext()) { Integer x = (Integer) it.next(); System.out.println (x.intvalue()); } leeres Update, update von x erfolgt im Schleifen-Rumpf! for (Iterator it = v.iterator(); it.hasnext(); ) { Integer x = (Integer) it.next(); System.out.println (x.intvalue()); } Folie 14.9

Beispiel 2 Methode zum Filtern von Elementen aus einer Collection static void filter(collection c) { Iterator i = c.iterator(); while (i.hasnext()) { if (filtertest(i.next())) i.remove(); } Beachte, daß diese Methode für jede beliebige Klasse funktionieren würde, die eine boolean Methode namens filtertest definiert hat ganz egal, wie die Datenkomponenten aussehen solange die Klasse angibt, daß sie das Interface Iterator implementiert Folie 14.10

Interface java.util.list Spezifiziert eine Collection, bei der die Elemente durchnumeriert sind ähnlich wie in einem Array aber mit flexibleren Zugriffsmöglichkeiten z.b. veränderlicher Größe realisiert als Unterklasse von java.util.collection das heißt, Objekte, die dieses Interface implementieren, müssen alle Collection-Methoden unterstützen und zusätzlich noch Methoden, die einen Zugriff über die Position des Elements erlauben Die totale Ordnung aller Objekte erlaubt auch, daß man die Objekte in beide Richtungen durchlaufen kann es gibt daher auch eine spezielle Unterklasse des Iterator-Interfaces, das erlaubt, in beide Richtungen zu laufen z.b. hasprevious(), previous(), etc. Interface ListIterator Folie 14.11

Die wichtigsten zusätzlichen Methoden Object get(int i) retourniere das i-te Element Object set(int i, Object o) weise dem i-ten Element das Objekt o zu int indexof(object o) Index des ersten Objekts, für das equals(o) gilt -1 falls es kein so ein Element gibt void add(int i, Object o) fügt o an der i-ten Stelle der Liste ein retourniert das Element, das sich vorher an dieser Stelle befunden hat Object remove(int i) entfernt und retourniert das Objekt an der i-ten Stelle List sublist(int von, int bis) retourniert die Teil-Liste beginnend mit von, endend mit bis-1 Folie 14.12

Vordefinierten Listen-Klassen Klasse LinkedList Implementiert eine Liste mit expliziter Verkettung d.h. in den Datenkomponenten wird ein Verweis auf das nächste und vorhergehende Listen-Element abgespeichert ähnlich zu der Implementierung, die wir im Abschnitt über rekursive Datenstrukturen kennengelernt haben Klasse ArrayList Implementiert eine Liste mittels eines Arrays d.h. die Elemente der Liste werden in einem Array abgespeichert Vor- und Nachteile: ArrayList ist schneller im Zugriff auf indizierte Elemente da sich die Adresse direkt berechnen läßt LinkedList ist schneller im Einfügen und Entfernen da die restlichen Einträge der Liste unberührt bleiben. Aber nach außen hin können sehen beide gleich aus da beide das Interface List implementieren Folie 14.13

java.util.vector Haben wir bereits kennengelernt Implementiert das List-Interface intern mittels eines Arrays sehr ähnlich zu ArrayList Unterschiede nur beim Zugriff aus mehreren Threads Daseinsberechtigung hauptsächlich aus historischen Gründen: die Klasse war bereits Teil von Java, bevor in der Version 1.2 das Collection Framework definiert wurde daher gibt es für einige Methoden auch noch andere Namen z.b. elementat(i) und get(i) machen genau das gleiche Folie 14.14

Interface java.util.set Spezifiziert eine Menge also eine Collection, in der kein Element doppelt vorkommen darf implementiert genau die Methoden, die für Collection vorgeschrieben sind aber keine zusätzlichen Methoden! Wozu wurde dann ein eigenes Interface definiert? die Bedeutung der Methoden ist eine andere Beispiel: für ein Objekt, das List implementiert, verändert die Methode add die Collection in jedem Fall durch Hinzufügen eines Elements für ein Objekt, das Set implementiert, wird die Methode nur verändert, wenn das hinzuzufügende Element nicht schon in der Collection enthalten ist. Zur Überprüfung Aufruf von equals! Unterschied liegt also in der Semantik, nicht in der Syntax Folie 14.15

Interface java.util.hashset implementiert das Interface Set mit Hilfe einer Hash-Tabelle was eine Hash-Tabelle ist werden wir in Kürze sehen Folie 14.16

import java.util.*; public class LottoZiehung { public static void main(string[] args) { HashSet zahlen = new HashSet(); //Lottozahlen erzeugen while (zahlen.size() < 6) { int num = (int) (Math.random() * 49) + 1; if (zahlen.add(new Integer(num))) { System.out.println( Neue Zahl + num); } else { System.out.println( DoppelteZahl + num + ignoriert ); } } //Lottozahlen ausgeben Iterator it = zahlen.iterator(); while (it.hasnext()) { System.out.println( ((Integer) it.next()).tostring()); } } } Folie 14.17 Beispiel Für ein Set retourniert add true, wenn ein neues Element hinzugefügt wurde, false sonst. Nach einem Beispiel aus http://www.javabuch.de

Interface java.util.sortedset Im vorigen Beispiel werden die sechs Lotto-Zahlen in der Reihenfolge, in der sie gezogen wurden, präsentiert schöner wär's natürlich, wenn sie in aufsteigender Reihenfolge sortiert wären dazu kann man sie entweder selber sortieren...... oder eine Klasse verwenden, die das Interface java.util.sortedset implementiert Interface java.util.sortedset wie java.util.set, nur daß die Elemente sortiert werden Problem: Um sortieren zu können, muß ich Elemente vergleichen können. Wie vergleiche ich zwei beliebige Elemente? Folie 14.18

java.util.comparator ein eigenes Objekt zum Durchführen von Vergleichen Einzige Methode: int compare(object o1, Object o2) vergleicht zwei Objekte o1 und o2 Rückgabewert analog zu oben Folie 14.19

java.util.comparable Interface, das angibt, daß auf Objekten, die dieses Interface implementieren, eine totale Ordnung definiert ist. die sogenannte natürliche Ordnung des Objekts Einzige vorgeschriebene Methode: int compareto(object o) vergleicht dieses Objekt mit dem Objekt o Rückgabewert: 0 wenn beide Objekte gleich sind äquivalent zu this.equals(o) positive Zahl, wenn dieses Objekt als größer als o anzusehen ist negative Zahl, wenn dieses Objekt kleiner als o Folie 14.20

Neue Methoden von SortedSet Comparator comparator() retourniert den Vergleichsoperator, der verwendet wird, oder null, falls die natürliche Ordnung der Elemente verwendet wird Object first() Das erste (niedrigste) Element in der sortierten Menge Object last() Das letzte (höchste) Element in der sortierten Menge SortedSet headset(object o) alle Elemente des Sets, die kleiner als o sind SortedSet tailset(object o) die Elemente des Sets, die größer oder gleich o sind SortedSet subset(object o1, Object o2) die Teilmenge von Elementen, die größer oder gleich o1 sind und kleiner als o2 sind Folie 14.21

Klasse java.util.treeset Implementiert das SortedSet Interface Speicherung der Mengen erfolgt in einer Baum-Struktur stellt sicher, daß in jedem Knoten nur ein Element vorhanden ist stellt auch die Sortierung sicher Beispiel: Um sortierte Lotto-Zahlen zu erhalten, muß man in unserem Beispiel nur die Zeile HashSet zahlen = new HashSet(); ersetzen durch TreeSet zahlen = new TreeSet(); So einfach ist das dank der Verwendung von Interfaces! da alle Methoden-Namen durch das gemeinsame Interface festgelegt sind. Folie 14.22

Konstruktoren von TreeSet TreeSet() erzeugt ein leeres TreeSet analog zu Konstruktoren von HashSet die Elemente werden nach Ihrer natürlichen Ordnung sortiert das heißt, die Objekte müssen das Interface Comparable implementieren Sortierung erfolgt durch Aufruf der compareto-methode der zu sortierenden Objekte TreeSet(Comparator c) erzeugt ein leeres TreeSet die Elemente werden durch Aufruf des Comparators c sortiert das heißt, die Objekte müssen nicht das Interface Comparable implementieren oder die Sortierung kann auch nach einer anderen Methode als der natürlichen Ordnung erfolgen Folie 14.23

Interface java.util.map realisiert einen assoziativen Speicher ein assoziativer Speicher besteht aus einer Tabelle von Paaren von Schlüssel und Wert Schlüssel (Keys): sind beliebige Objekte jeder Schlüssel kann nur maximal einmal vorkommen Werte (Values): sind ebenfalls beliebige Objekte jedem Schlüssel wird genau ein Wert zugeordnet die Tabelle ist als Abbildung von beliebigen Objekten (Schlüsseln) auf andere Objekte (Werte) zu verstehen genauso wie bei einem Array oder bei einer Liste jeder integer Zahl (dem Index) ein Objekt zugeordnet ist kann bei einem Map einem beliebigen Objekt (dem Schlüssel) ein anderes Objekt zugeordnet werden (mapping = Abbildung) Folie 14.24

Schematische Illustration List (bzw. Array) 0 object1 1 object2 2 object3... n-1 objectn Map dog cat pig last... object1 object2 object3 objectn Zugriff l.set(2,object3) Object o = l.get(2); Zugriff m.put( pig,object3) Object o = m.get( pig ); Folie 14.25

Wichtige Methoden von java.util.map Object get(object key) retourniert den dem Schlüssel key zugeordneten Wert Object put(object key, Object val) ordnet dem Schlüssel key den Wert val zu Object remove(object key) Entfernt den Schlüssel key (und damit den zugehörigen Wert) boolean containskey(object key) true wenn es einen Eintrag mit dem Schlüssel key gibt boolean containsvalue(object val) true wenn es einen Eintrag mit dem Wert val gibt Set keyset() retourniert alle Schlüssel als ein Set (keine Duplikate) Collection values() retourniert alle Werte als eine Collection Folie 14.26

Klasse java.util.hashmap realisiert eine Map mit einer sogenannten Hash-Tabelle Hash-Tabellen ordnen jedem Objekt eine fixe Zahl zu die Zuordnung sollte nach Möglichkeit eindeutig sein (also verschiedene Objekte werden mit verschiedenen Zahlen identifiziert und die (große) Anzahl der möglichen Objekte auf eine relativ kleine Anzahl von möglichen Werten reduzieren und relativ effizient zu berechnen sein Einige bekannte Hashing-Funktionen MD5 SHA-1 Die Idee von Checksummen ist ähnlich der Idee von Hash-Funktionen im Prinzip kann eine Checksumme als eine Hash-Funktion verwendet werden und umgekehrt Folie 14.27

Hash-Codes Wo kommen die Hash-Codes her? Methode hashcode() von java.lang.object kann ererbt, aber auch speziell implementiert werden Anforderungen für jedes Objekt muß ein Integer Code retourniert werden während eines Ablaufs des Programms muß immer der gleiche Code retourniert werden bei verschiedenen Abläufen können es auch verschiedene Codes sein es ist nicht verlangt, daß das zwei verschiedene Objekte verschiedene Hash- Codes retournieren (wär aber gut) Die Default-Implementierung, die von java.lang.object geerbt wird retourniert üblicherweise die Speicheradresse des Objekts muß aber nicht so sein Folie 14.28

import java.util.*; Beispiel public class MailAliases { public static void main(string[] args) { HashMap h = new HashMap(); //Pflege der Aliase h.put("fritz","f.mueller@test.de"); h.put("franz","fk@b-blabla.com"); h.put("paula","user0125@mail.uofm.edu"); h.put("lissa","lb3@gateway.fhdto.northsurf.dk"); } } //Ausgabe Iterator it = h.keyset().iterator(); while (it.hasnext()) { String key = (String)it.next(); System.out.println(key + " --> " + (String)h.get(key) ); } Folie 14.29 Beispiel aus http://www.javabuch.de

Weitere Map-Klassen Klasse java.util.hashtable alte Implementation von Hash-Tables Unterschiede zu HashMap minimal Interface java.util.sortedmap Eine Map, bei der die Schlüssel sortiert bleiben d.h. die Schlüssel bilden kein Set, sondern ein SortedSet Klasse java.util.treemap Klasse, die das SortedMap Interface implementiert Folie 14.30

Klasse java.util.collections Eine Sammlung von statischen Methoden zum Arbeiten mit Collections Methoden zum Sortieren static void sort(list list) Sortieren nach natürlicher Ordnung der Objekte static void sort(list list, Comparator c) Sortieren nach dem Comparator-Objekt Weitere Methoden zum Suchen Kopieren Mischen... Details Java API Dokumentation Folie 14.31

Beispiel Im vorigen Beispiel können die E-mail-Adressen in alphabetischer Reihung ausgegeben werden: //Ausgabe ArrayList keys = new ArrayList(h.keySet()); Collections.sort(keys); Iterator it = keys.iterator(); while (it.hasnext()) { String key = (String)it.next(); System.out.println(key + " --> " + (String)h.get(key) ); } wird die Sortierung häufig verwendet, würde sich in diesem Beispiel natürlich die Verwendung von TreeMap statt HashMap empfehlen das Programm müßte außer bei der Typ-Dekaration von h (und dem Einsparen der sort-anweisung) wiederum nicht verändert werden! Folie 14.32

Abstrakte Basis-Klassen Zur Neu-Definition von Objekten, die Collection Interfaces implementieren, kann man (wenn man möchte) von existierenden abstrakten Basis-Klassen ableiten AbstractCollection AbstractList AbstractSet AbstractMap Die Basis-Klassen implementieren einige der Methoden, die dann von den abgeleiteten Klassen geerbt werden können andere müssen in der abgeleiteten Klasse implementiert werden Insbesondere sind alle bisher besprochenen Klassen von diesen abstrakten Klassen abgeleitet Folie 14.33

Generics (neu in Java 1.5) Zur einfacheren Handhabung der Typen-Konversionen wurden in Java 1.5 sogenannte Generics eingeführt Generics sind allgemeine Typen-Schablonen, mit deren Hilfe man bei der Deklaration von Objekten den Typ von bestimmten Daten-Komponenten angeben kann Der Typ wird innerhalb von <...> angegeben Beispiel: ArrayList<String> x = new ArrayList<String>(); vereinbart eine ArrayList, die nur mit String-Elementen gefüllt werden kann. Vorteile (am Beispiel von Collections): Der Compiler weiß, welche Objekte in die Collections eingespeichert werden sollen, und kann verhindern, daß falsche Objekte zugewiesen werden Der Compiler weiß, welchen Typ die Objekte in der Collection haben, daher ist ein expliziter Down-Cast nicht mehr notwendig. Folie 14.34

Beispiel Generics Mit Generics: Ohne Generics: // Removes 4-letter words from c. // Elements must be strings static void expurgate(collection c) { for (Iterator i = c.iterator(); i.hasnext(); ) if (((String) i.next()).length() == 4) i.remove(); } Explizites down-cast notwendig // Removes the 4-letter words from c static void expurgate(collection<string> c) { for (Iterator<String> i = c.iterator(); i.hasnext(); ) if (i.next().length() == 4) i.remove(); } Generics geben an, welcher Objekt-Typ in der Collection enthalten ist. Diese Methode funktioniert für alle Collections, die Strings enthalten. Folie 14.35

Interface Iterable Seit Java 1.5 gibt es ein Interface Iterable Einzige Methode: Iterator iterator() retourniert einen Iterator für dieses Objekt Alle Collections implementieren somit das Interface Iterable. Anmerkung: Iterators können auch als Generics deklariert werden Die Deklaration Iterator<X> iterator() bewirkt, daß der Methodenaufruf next() immer ein Objekt vom Typ X retourniert. Folie 14.36

Erweiterung der for-schleife Seit der Java-Version 1.5 ist auch folgende vereinfachte Syntax für for-schleifen über Objekte vom Type Iterable Alte Version ArrayList v = new ArrayList();... for (Iterator it = v.iterator(); it.hasnext(); ) { Integer x = (Integer) it.next(); System.out.println (x.intvalue()); } Neue Version ArrayList<Integer> v = new ArrayList<Integer>();... Iteriert über alle Integerfor (Integer x : v) { Objekte in der Collection v System.out.println (x.intvalue()); } Folie 14.37