Rückblick: Inf A - Algorithmen. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 07: Collections 1. Inhalt.



Ähnliche Dokumente
Grundkonzepte java.util.list

JAVA KURS COLLECTION

Info B VL 14: Java Collections/Reflections

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

Programmierkurs Java

Kapitel 6: Java Collection Teil I

19 Collections Framework

Kapitel 7: Java Collection Teil I

19 Collections Framework

Kapitel 5: Iterierbare Container

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

Einstieg in die Informatik mit Java

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

Objektorientiertes Programmieren mit Java

Programmierkurs Java

Teil V. Generics und Kollektionen in Java

Algorithmen und Datenstrukturen in Java Jiri Spale, Algorithmen und Datenstrukturen in Java 1

Rechtsbelehrung. Java und OOP Das Buch Christian Silberbauer 144

II.4.6 Collections - 1 -

Programmieren 2 16 Java Collections und Generizität

OCP Java SE 8. Collections

Abstrakte Datentypen und Java

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

ADT: Java Collections und ArrayList

Verkettete Listen. Implementierung von einfach verketteten Listen. Implementierung von doppelt verketteten Listen

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

Java Einführung Collections

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

II.4.4 Exceptions - 1 -

ALP II Dynamische Datenmengen

Mengen und Multimengen

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

Grundlagen der Informatik 0

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

Javakurs für Fortgeschrittene

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

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

Java Collections Framework (JCF)

Vorlesung Programmieren

Einführung in die Programmierung mit Java

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

Collections. Arthur Zaczek. Nov 2015

Sammlungen Listen Mengen Abbildungen Algorithmen Wrapper

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

Objektorientierte Implementierung

Propädeutikum Programmierung in der Bioinformatik

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

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

Mengen und Multimengen

Einführung in die Programmierung

Programmiertechnik II

Probeklausur: Programmierung WS04/05

Nützliche Utility-Klassen des JDK

Info B VL 11: Innere Klassen/Collections

Programmiertechnik II

Software Entwicklung 1

Software Entwicklung 1

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

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

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

Einstieg in die Informatik mit Java

Das Interface-Konzept am Beispiel der Sprache Java

Programmieren in Java

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

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

Verkettete Datenstrukturen: Listen

Kapitel 5: Interfaces

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

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

Collections. Arthur Zaczek

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

Innere Klassen. Innere Klassen. Page 1. Lernziele: innere Klassen, statische geschachtelte Klassen, anonyme Klassen.

Einführung in die Programmierung

Implementieren von Klassen

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Programmiertechnik II

Objektorientierte Programmierung. Kapitel 14: Interfaces

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

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

Algorithmen und Datenstrukturen CS1017

Generische Polymorphie in Java-

Programmieren I. Kapitel 13. Listen

Info B VL 8: Abstrakte Klassen & Interfaces

ADT: Verkettete Listen

Algorithmen und Datenstrukturen

Physikalisch Technische Lehranstalt Wedel 31. Januar 2004 Prof. Dr. Uwe Schmidt

Inner Class. 1 public class OuterClass { 2 private int var; 3 public class InnerClass { 4 void methoda() {}; 5 } 6 public void methodb() {}; 7 }

Programmiertechnik II Klausur SS 2018 Angewandte Informatik Bachelor

Objektorientierte Softwareentwicklung

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Lösungsvorschläge zur Nachklausur zum Kurs 1618 Sommersemester 2001 am

12 Abstrakte Klassen, finale Klassen und Interfaces

Transkript:

Universität Osnabrück 1 Rückblick: Inf A - Algorithmen 3 - Objektorientierte Programmierung in Java Vorlesung 07: Collections 1 SS 2006 Prof. Dr. F.M. Thiesing, FH Osnabrück Abstrakte Datentypen Liste VerweisListe Keller VerweisKeller Implementation mit einem Array Schlange ArraySchlange Baum VerweisBaum Suchbaum Hashing Inhalt 2 4 Collections Rückblick Basisinterface Collection Iteratoren Exkurs: Interface Enumeration Exkurs: Innere Klassen Beispiele Collections Collections sind Klassen, die Behälter realisieren, um beliebig viele Objekte ablegen und bei Bedarf wieder herausholen zu können. Die Collections in der Java-Klassenbibliothek implementieren viele in der Informatik gebräuchliche Datenstrukturen wie z.b. Listen, Hash-Tabellen, Bäume etc. Die Collections implementieren diese Datenstrukturen im Sinne von abstrakten Datentypen, d.h. ihre Eigenschaften sind durch die zur Verfügung gestellten Operationen definiert.

5 7 Collections Die interne Realisierung der einzelnen Collections wird vor dem Benutzer (Programmierer) weitestgehend verborgen. Die Daten werden gekapselt abgelegt, und der Zugriff ist nur mit Hilfe vorgegebener Operationen möglich. Collections können Referenzen auf Objekte beliebiger Klassen speichern. Alle Collection-Klassen sind im Paket java.util enthalten. Unterschiede Die wichtigen Operationen der traditionellen Collections sind synchronisiert, d.h. auf eine Collection kann von mehreren parallel ablaufenden Threads (vereinfacht betrachtet ist ein Thread die Ausführung eines Programmstücks) zugegriffen werden, ohne dass es zu inkonsistenten Daten kommt. Dies beeinträchtigt jedoch die Geschwindigkeit, mit der die Operationen ausgeführt werden. Die Operationen des Collection-Frameworks sind durchweg unsynchronisiert. 6 8 Historische Entwicklung Die Collection-Klassen wurden in zwei Schritten in die Java-Klassenbibiliothek aufgenommen. Bereits seit dem JDK 1.0 existieren die traditionellen Collection-Klassen Vector, Stack, HashTable, Properties und BitSet. Seit dem JDK 1.2 ist eine Sammlung von gut 20 Klassen und Interfaces hinzugekommen, die auch als Collection-Framework bezeichnet werden. Aus diesem Grund enthält die Klassenbibliothek z.t. Klassen mit ähnlichen Namen und ähnlicher Funktionalität (Operationen) aber Unterschieden im Detail. Grundformen der JDK-1.2 Collections List: beliebig große lineare Liste von Elementen beliebigen Typs, auf die sowohl sequentiell als auch wahlfrei (über einen Index) zugegriffen werden kann Set: Ansammlung von Elementen, auf die mit typischen Mengenoperationen zugegriffen werden kann und die keine Elemente doppelt enthält Map: Abbildung von Elementen eines Typs auf Elemente eines anderen Typs, also eine Menge zusammengehöriger Paare von Objekten

9 11 Grundformen der JDK-1.2 Collections Jede der drei Grundformen ist als Interface unter dem oben genannten Namen in der Java-Klassenbibliothek vorhanden. Zu jedem Interface existieren eine oder mehrere abstrakte Klassen, mit deren Hilfe das Erstellen eigener Collection-Klassen erleichtert wird. Zudem gibt es für jedes Interface eine oder mehrere konkrete Implementierungen, die sich in den verwendeten Datenstrukturen und Algorithmen unterscheiden. Klassenhierarchie Map SortedMap HashTable HashMap TreeMap Properties Interfaces Konkrete Klassen 10 Basisinterface Collection 12 Klassenhierarchie Collection Interfaces Das BasisInterface Collection fasst die wesentlichen Operationen der Collections vom Typ Set und List zusammen: List Set SortedSet Konkrete Klassen LinkedList ArrayList Vector HashSet TreeSet Stack Einfügen von Elementen List: Einfügen eines Objektes boolean add(object o) Entfernen von Elementen Entfernen eines Objekts Set: boolean remove(object o) Entfernen aller Elemente void clear()

Basisinterface Collection 13 Basisinterface Collection 15 Abfragen Überprüfung, ob eine Collection leer ist boolean isempty() Bestimmung der Anzahl der gespeicherten Elemente int size() Überprüfung, ob eine Collection ein bestimmtes Objekt o enthält boolean contains(object o) Beachte: Die Operation contains ruft intern die Operation equals des übergegebenen Objekts auf, um festzustellen, ob eines der Elemente der Collection zu o inhaltsgleich ist. Typsicherheit (bis JDK 1.4) Eine Collection erlaubt die Speicherung von Objekten beliebiger Klassen, denn die Einfügeoperation besitzt einen Parameter vom Typ Object. Leider ist der Zugriff auf die gespeicherten Objekte damit nicht typsicher. Der Compiler kann nicht wissen, von welchem Typ die Objekte sind, die in einer Collection gespeichert wurden, und geht daher davon aus, dass beim Zugriff auf ein Element der Collection eine Instanz der Klasse Object geliefert wird. Mit Hilfe des Castings muss diese dann in den ursprünglichen Objekttyp zurück-verwandelt werden. Basisinterface Collection 14 Basisinterface Collection 16 Umwandlung Speicherung der Elemente einer Collection in ein neues Feld Object[] toarray() Zugriff auf Elemente Erzeugung eines Iterators für den sequentiellen Zugriff auf die Elemente Iterator iterator() Typsicherheit (bis JDK 1.4) Die Verantwortung für die korrekte Typisierung liegt damit beim Programmierer. Beispiel: List list;... ListIterator it = list.listiterator(); String s = (String) it.next(); Mit Hilfe des Operators instanceof kann bei Bedarf zur Laufzeit überprüft werden, von welchem Typ ein Objekt ist. Beispiel: Object o = it.next(); if (o instanceof String) s = (String) o;

17 19 Klassenhierarchie Interfaces (Abtrakte) Klassen Collection AbstractCollection List AbstractList AbstractSequentialList ArrayList LinkedList Vector Stack Interface List Das Interface List erbt alle Operationsdeklarationen des Interface Collection. Das Interface List präzisiert die Operationen add und remove gegenüber Collection wie folgt: boolean add(object element) fügt ein neues Element am Ende der Liste ein boolean remove(object o) entfernt das (im Sinne eines sequentiellen Durchlaufs) erste Element der Liste, das mit o inhaltsgleich ist. Wurde ein Element entfernt, ist der Ergebniswert true, ansonsten false. 18 20 Eigenschaften Eine Collection vom Typ List ist eine geordnete Folge von Objekten, die entweder sequentiell oder über ihren Index (d.h. ihre Position in der Liste) zugegriffen werden können. Wie bei einem Feld (Array) hat das erste Element den Index 0 und das letzte Element den Index size()-1. Es ist möglich, an einer beliebigen Stelle der Liste ein Element einzufügen oder zu löschen. Zusätzlich zu den Operationen von Collection definiert List u.a. die folgenden Operationen: void add(int index, Object element) fügt ein neues Element an der Position index ein und schiebt alle nachfolgenden Elemente eine Position weiter. Object remove(int index) entfernt das Element an der Position index und schiebt alle nachfolgenden Elemente eine Position nach vorne. Object set(int index, Object element) ersetzt das Element an der Position index durch das Objekt element Object get(int index) liefert das Element an der Position index als Ergebnis

21 23 int indexof(object o) liefert die Position des ersten Elements der Liste, das mit o inhaltsgleich ist oder das gleich null ist, wenn o gleich null ist. Wird kein Element gefunden, ist das Ergebnis 1. int lastindexof(object o) liefert die Position des letzten Elements der Liste, das mit o inhaltsgleich ist oder das gleich null ist, wenn o gleich null ist. Wird kein Element gefunden, ist das Ergebnis 1. List sublist(int fromindex, int toindex) erzeugt eine Teilliste von der Position fromindex (einschließlich) bis zur Position toindex (ausschließlich) Beachte: Änderungen, die in der Teilliste vorgenommen werden, sind auch in der Gesamtliste wirksam. Implementierungen Klasse LinkedList: realisiert eine Liste, deren Elemente als doppelt verkettete lineare Liste gehalten werden Im Vergleich zu ArrayList und Vector ist der wahlfreie Zugriff langsamer, aber die Einfüge- und Löschoperationen sind insbesondere bei großen Elementzahlen schneller. LinkedList: 22 24 ListIterator listiterator() erzeugt ein ListIterator-Objekt, mit dessen Hilfe die Liste beginnend am Anfang der Liste sequentiell durchlaufen werden kann. ListIterator listiterator(int index) erzeugt ein ListIterator-Objekt, mit dessen Hilfe die Liste beginnend an der Position index sequentiell durchlaufen werden kann. Anmerkungen Alle Positionen index müssen jeweils größer gleich 0 und kleiner size() sein, sonst wird eine Exception ausgelöst. Bei den Operationen add und listiterator bzw. sublist darf die Position index bzw. toindex auch gleich size() sein. Implementierungen (2) Klasse ArrayList: implementiert die Liste als Feld von Elementen, das bei Bedarf vergrößert wird Im Vergleich zur LinkedList ist der wahlfreie Zugriff schneller, aber das Einfügen und Löschen kann insbesondere bei großen Elementzahlen länger dauern. Wird die interne Kapazität des Feldes überschritten, muss das Feld umkopiert werden. ArrayList:

25 Iteratoren 27 Klasse Vector Eigenschaften, s. ArrayList (außer Synchronisation) Aus Gründen der Vereinheitlichung implementiert seit dem JDK 1.2 auch die Klasse Vector das List-Interface, d.h. sie stellt alle im List-Interface definierten Operationen zur Verfügung. Daneben existieren noch alte Operationen, wie z.b: addelement, insertelementat, removeelement, removeelementat, elementat und eine eigenes Interface für Iteratoren mit dem Namen Enumeration. Beachte: Die wichtigen Operationen der Klasse Vector sind synchronisiert. Alle drei Klassen besitzen einen Konstruktor ohne Parameter. Sequentieller Durchlauf Nach der Initialisierung zeigt ein Iterator-Objekt auf eine Stelle vor dem ersten Element der Collection. Durch Aufruf von hasnext kann geprüft werden, ob weitere Elemente enthalten sind. Die Operation next liefert das nächste Element bzw. löst eine Ausnahme des Typs NoSuchElementException aus, wenn es keine weiteren Elemente gibt. Iteratoren 26 Iteratoren 28 Ein Iterator ist eine Abstraktion für den sequentiellen Zugriff auf alle Elemente einer Collection. Ein Iterator für Collection-Klassen wird in Java durch das Interface Iterator definiert. Das Interface Iterator deklariert die folgenden Operationen: boolean hasnext() Object next() void remove() Modifikation der Collection Zusätzlich besteht die Möglichkeit, die Collection während des sequentiellen Durchlaufs zu verändern, indem das zuletzt geholte Element mit der Operation void remove() gelöscht wird. Dies ist die einzig erlaubte Möglichkeit, die Collection während der Verwendung eines Iterators zu verändern. Alle direkt ändernden Zugriffe auf die Collection machen das weitere Verhalten des Iterators undefiniert.

Iteratoren 29 Iteratoren 31 Für steht das aus Iterator abgeleitete Interface ListIterator zur Verfügung, welches zusätzliche Operationen definiert: Durchlauf durch die Liste in beiden Richtungen boolean hasprevious() prüft, ob vor der aktuellen Position ein Element existiert Object previous() liefert das Element vor der aktuellen Position, soweit vorhanden Zugriff auf Index von Elementen int nextindex() Wird nextindex am Ende der Liste aufgerufen, liefert es size() als Rückgabewert. Beispiel ListTest Iteratoren 30 Die Klasse java.util.collections 32 int previousindex() Wird previousindex am Anfang der Liste aufgerufen, liefert es -1 als Rückgabewert. Veränderung der Collection void add(object o) Einfügen eines neuen Elements an der Stelle in die Liste, die unmittelbar vor dem nächsten Element des Iterators liegt. void set(object o) erlaubt es, das durch den letzten Aufruf von next bzw. previous beschaffte Element zu ersetzen. Diese Klasse stellt eine Reihe von statischen Hilfsfunktionen für Collections zur Verfügung. z.b.: sortieren, shuffeln, min oder max liefern, kopieren, Reihenfolge umkehren, Elemente vertauschen, etc. public static void shuffle(list list) Vertauscht die in list enthaltenen Elemente zufällig. Alle möglichen Permutationen sind gleich wahrscheinlich.

Exkurs: Enumeration-Interface 33 Exkurs: Innere Klassen 35 Idee: Für eine Datenstruktur, die Elemente hält, sollen diese Elemente aufgezählt werden Typisch für Collection-Klassen, in denen Objekte gehalten werden Sehr ähnlich zum Iterator-Interface Vordefiniertes Enumeration-Interface mit zwei Methoden: boolean hasmoreelements(): true, wenn die Aufzählung noch weitere Elemente enthält, sonst false Object nextelement(): liefert das nächste Element, falls es existiert, sonst wird eine NoSuchElementException ausgelöst Innere Klassen seit Java 1.1 Zur Definition von Hilfsklassen an der Stelle, wo sie gebraucht werden Klarerer Code, weniger Quell-Dateien Beispiel: Enumeration-Interface 34 Innere Klassen im 36 MyList.java Mitgliedsklassen (Member Classes) ListEnumerator.java Statische Mitgliedsklassen (Nested Top-Level- Classes=Geschachtelte Top-Level-Klassen) Lokale Klassen Anonyme Klassen

Mitgliedsklassen (Member Classes) 37 Geschachtelte Top-Level-Klassen 39 Typische, echte innere Klassen Erweiterung der Sprache Java (1.1), aber nicht der JVM impliziter Zugriff auf Instanz der einschließenden Klasse Ein Objekt der inneren Mitgliedsklasse kann nur zusammen mit einem Objekt der umschließenden Klasse existieren. Typische Anwendung: Mitgliedsklassen Entry, Iterator der Collections-Klassen. static-modifikator Verhalten wie normale Top-Level-Klasse Haben Zugriff auf alle statischen Komponenten der umschließenden Klasse. Statische innere Klassen dienen vor allem der Strukturierung von Programmcode. Beispiel: Mitgliedsklasse 38 Beispiel: Statische Mitgliedsklasse 40 public class Hi { static String a = "A"; private String b = "B"; class B { // Elementklasse B void hi () { System.out.print("member: " + a + b); System.out.println(Hi.this.a + Hi.this.b); /* dies ist die explizite Form */ void hi() {... new B().hi(); // fuehrt hi() der Klasse B aus... public class Hi { static String a = "A"; private String b = "B"; static class A { // geschachtelte Top-Level-Klasse A void hi () { System.out.println("top-level: " + a); // System.out.println(b); /* geht nicht: b ist nicht static! */ static public void main (String args []) { new Hi.A().hi(); // fuehrt hi() der Klasse A aus Name der Klasse: Hi.A

Lokale Klassen 41 Anonyme Klassen 43 definiert im Java-Block, nur dort sichtbar Wie Member-Klassen: Zugriff auf alle Komponenten der umschließenden Klasse. Zusätzlich auf alle im Block sichtbaren final Parameter und Variablen. weitgend wie lokale Klasse Deklaration und Instantiierung in einer Anweisung kein Name, kein Konstruktor, aber Instanzinitialisierer Typische Anwendung: Implementierung von Event-Listenern bei GUI (AWT, Swing) Beispiel: Lokale Klasse 42 Beispiel: Anonyme Klasse 44 public class Hi { static String a = "A"; private String b = "B"; void hi (final String c) { final String d = "D"; String e = "E"; class C { // lokale Klasse C void hi () { System.out.println("lokal: " + a + b + c + d); // System.out.println(e); // geht nicht: e ist nicht final! new C().hi(); // fuehrt hi() der Klasse C aus public class Hi {... static String a = "A"; private String b = "B"; void hi (final String c) { final String d = "D"; Object o = new B() { // anonyme Klasse ist Subklasse von Klasse B // (oder implementiert das Interface B) { System.out.println("Instanzinitialisierer der anonymen Klasse"); void hi () { System.out.println("anonym: " +a+b+c+d); ; ((B)o).hi(); // fuehrt hi() der anonymen Klasse aus

Das Beispiel im 45 Source: Hi.java Das Übersetzen des Programms Hi.java erzeugt die Class-Dateien: Hi.class Hi$A.class Hi$B.class Hi$1.class Hi$1C.class.