Vorlesung Programmieren. Programme verarbeiten Daten. Generische Datenstrukturen. Java Generics und Java API



Ähnliche Dokumente
Programmierkurs Java

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

Abstrakte Datentypen und Java

Java Einführung Collections

JAVA KURS COLLECTION

Einstieg in die Informatik mit Java

Kapitel 5: Iterierbare Container

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

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

Grundkonzepte java.util.list

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

Programmieren 2 16 Java Collections und Generizität

Programmieren in Java

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

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

Teil V. Generics und Kollektionen in Java

II.4.4 Exceptions - 1 -

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

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

Institut für Informatik

ADT: Java Collections und ArrayList

Mengen und Multimengen

Java I Vorlesung Collections

Java Collections Framework (JCF)

Einführung in die Programmierung mit Java

Algorithmen und Datenstrukturen CS1017

Informatik II Übung 6

19 Collections Framework

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

Programmieren I. Kapitel 13. Listen

ListElement (E i n f o, ListElement<E> prev, ListElement<E> next ) {

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

Programmieren in Java -Eingangstest-

Neuere Sprachelemente in Java

Programmierkurs C++ Templates & STL (1/2)

Vorlesung Informatik 2

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

Programmieren in Java

Probeklausur zur Vorlesung

Wie entwerfe ich ein Programm?

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

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

Grundlagen der Informatik Generische Klassen

Kapitel 5: Interfaces

Programmieren 2 Übung Semesterwoche 2

12 Abstrakte Klassen, finale Klassen und Interfaces

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

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

Stacks, Queues & Bags. Datenstrukturen. Pushdown/Popup Stack. Ferd van Odenhoven. 19. September 2012

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

Java Spickzettel von Panjutorials.de

Algorithmen und Datenstrukturen

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Programmieren 2 Java Überblick

4.4.9 Das Java Collection Framework

Probeklausur: Programmierung WS04/05

Transkript:

Vorlesung Programmieren Java Generics und Java API Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer Programme verarbeiten Daten Häufig benötigt: Datenstrukturen zum Speichern Bisher: Spezielle Datenstrukturen pro Programm: Security - 04 Cryptology #2 Generische Datenstrukturen Häufig benötigte Datenstrukturen (ausführlich in AuD im 2. Semester) Listen Keller bzw. Stapel (Stack) Warteschlangen (Queues) Mengen... Natürlich kann man diese selbst programmieren Security - 04 Cryptology #3

Beispiel: Eigene generische Liste Security - 04 Cryptology #4 Mögliche Implementierung Speichert alle in Java möglichen Objekte, da alle transitiv von Objekt erben Es können (bei dieser Implementierung) maximal maxelemente gespeichert werden in einer konkreten Instanz Security - 04 Cryptology #5 Mögliche Implementierung Security - 04 Cryptology #6

Mögliche Implementierung Security - 04 Cryptology #7 Mögliche Implementierung Security - 04 Cryptology #8 Mögliche Implementierung Was praktisches: schöne Ausgabe der Instanz Security - 04 Cryptology #9

Verwendung Security - 04 Cryptology #10 Der Obstkorb und die Liste Security - 04 Cryptology #11 Problem dieser Implementierung Verwendung einer festen maximalen Größe Werden mehr Elemente eingefügt als Platz verfügbar ist, werden diese nicht gespeichert Besser: dynamische Größenanpassung Liste sollte dynamisch mitwachsen Alternative Implementierung siehe nächste Folie Security - 04 Cryptology #12

Dynamische Liste Security - 04 Cryptology #13 Datenstrukturen und Java Dieses Problem betrifft praktisch alle Programme In vielen Sprachen (z.b. C) hat praktisch jedes Programm seine eigenen Datentypen implementiert Probleme: viel unnötiger Code, Fehlerquelle, schwer auszutauschen, jedes Programm war einzigartig hohe Einarbeitungszeit Daher: Java stellt Standardtypen bereit Teil der Java Distribution Sog. Java Collections Framework (java.util.*) Referenzen http://download.oracle.com/javase/tutorial/collections/ http://download.oracle.com/javase/7/docs/api/ 14 Java Collections Framework (JCF) Stellt sog. Container-Klassen bereit Container nehmen andere Datentypen in sich auf Dynamische Datenstrukturen, die ihre Größe anpassen Zwei grundlegende Typen: Collection und Map Collection (java.util.collection) in dieser Vorlesung Listen, Mengen, Schlangen (Queues) Map für Assoziativspeicher (java.util.map) Speichert <name, wert>-tupel 15

Java Collections Framework (JCF) Interfaces legen den Funktionsumfang eines Containertyps fest z.b. das Interface Collection Konkrete Klassen erben von diesen und implementieren die Funktion des Containers Abstrakte Basisklassen dienen zur vereinfachten Implementierung konkreter Klassen Beispiel Implementiert Interface Collection Abstrakte Listenimplementierung Konkret, Speicherung in Array 16 Teil der Vererbungshierarchie Collection AbstractList AbstractSet ArrayList... Vector TreeSet... HashSet Security - 04 Cryptology #17 Collection Interface Wichtige Methoden boolean add(e e); void clear(); boolean contains(object o); int size(); Iterator iterator();... Was ist wohl ein Iterator? Später... Security - 04 Cryptology #18

Interface java.util.collection 19 Instanziierung einer Collection Beispiel: Verwendung einer Liste Zunächst Wahl einer Implementierung Dann Instanziierung Collection c = new ArrayList(); 20 Verwendung von Collection import java.util.*; public class NutzungVonCollection private static void test( Collection c ) for ( int i = 0; i < 5; i++ ) c.add( i ); System.out.println( Ist leer? + c.isempty()); System.out.println( Anzahl Elemente: + c.size()); 21

Konzept der Iteratoren Dient dem Zugriff auf Elemente einer Collection Im einfachsten Fall kann man nur vorwärts von einem Element zum nächsten gelangen Iterator iterator = collection.iterator(); Zwei wesentliche Methoden eines Iterators boolean hasnext(): true, wenn es ein weiteres Element gibt Object next(): Liefert nächstes Objekt Beispiel: Iteration über Collection next() next() next() next() next() next() next() next() hasnext: true hasnext: true hasnext: true hasnext: true hasnext: true hasnext: true hasnext: true hasnext: true hasnext: false 1324 234 333 445 54343 6434 75 8345 Security - 04 Cryptology #22 Verwendung von Iteratoren Vorsicht: nicht 2x next() aufrufen pro 1x hasnext() z.b. innerhalb der while-schleife 23 Verwendung von Iteratoren Oft besser: Referenz auf nächstes Objekt einer Variable zuweisen 24

Kürzere Variante: for-schleife Iterationen über Collections lassen sich mit der for-schleife prägnant und kurz schreiben Initialisierung: Zuweisung einer Iterator-Referenz Bedingung: Prüfen auf hasnext(); Inkrement: Nichts tun Security - 04 Cryptology #25 Noch kürzere Variante: foreach-schleife Seit Java 1.5 gibt es noch eine weitere Schleife Speziell für die Iteration über Collections, Arrays, etc. Abkürzende Schreibweise, kann durch for-schleife ersetzt werden Möglich für alle Objekte, die das Interface Iterable implementieren Also z.b. Collection Syntax: for(typ variable : iterableobject ) statement; Security - 04 Cryptology #26 Das Interface Iterable 27

Foreach und Collections Beispiel: Umwandlung einer for-schleife in eine foreach-schleife Security - 04 Cryptology #28 Collections und ihre Daten Beispiel c.add( new String( 1 ) ); c.add( new Integer(42) ); Collection enthält String- und Integer-Instanzen add-methode akzeptiert nur Object-Instanzen Iterator kann daher nur Object zurückgeben Beispielhafte Iteration über diese Collection for(object o : c) System.out.println( Länge: + ((String)o).length()); Problem: Typsicherheit Wie stellt man sicher, dass in einer Collection nur Daten eines bestimmten Typs gespeichert werden können? 29 Wie speichert man Daten? class IntBox private int val; class StringBox private String val; void setvalue( int val ) this.val = val; int getvalue() return val; void setvalue( String val ) this.val = val; String getvalue() return val; 30

Wie implementiert man generische Typen? Häufig durch Speichern von Object- Instanzen class ObjectBox private Object val; void setvalue( Object val ) this.val = val; Object getvalue() return val; Verwendung Box b = new Box(); Point p = new Point(1,2); b.setvalue( p ); Probleme ((Point)b.getValue()).getX(); Umständlich Jeder Zugriff erfordert Typ-Cast Unsicher Typ-Cast kann fehlschlagen ((Vector)b.getValue()).doX(); ClassCastException 31 Lösung: Generische Typen in Java Sog. Java Generics Klassen und Methoden können generisch implementiert werden Statt Object wird ein Platzhalter-Typ verwendet Alt: private Object val; Neu: private T val; Dieser Typ kann wie ein normaler Typ verwendet werden Bei der konkreten Verwendung muss T spezifiert werden Security - 04 Cryptology #32 Lösung: Java Generics class ObjectBox private Object val; class Box<T> private T val; Sagt Java, dass T im Folgenden ein Platzhalter ist void setvalue( Object val ) this.val = val; Object getvalue() return val; void setvalue(t val) this.val = val; T getvalue() return val; 33

Verwendung Instanziierung Box<String> stringbox = new Box<String>(); Box<Integer> intbox = new Box<Integer>(); Box<Point> pointbox = new Box<Point>(); Zugriff Point p = new Point(1,2); pointbox.setvalue( p ); double x = pointbox.getvalue().getx(); getvalue() liefert Point zurück 34 Generics: Einfache generische Methoden class HopOderTop public static <T> T aoderb(t a, T b) if (Math.random() > 0.5) return a; else return b; System.out.println( HopOderTop.aOderB( Zuhören, Weiterschlafen ) ); System.out.println( Note: + HopOderTop.aOderB( 1.0, 1.3 ) ); 35 Seit Java 1.5 verwendet das JCF Generics Alt: Collection l = new ArrayList(); Neu: Collection<String> = new ArrayList<String>(); Vorteile Es können keine falschen Datentypen mehr gespeichert werden Typ-Cast entfällt Beispiele: nächste Folie 36

Beispiel: Ohne und mit Generics Security - 04 Cryptology #37 Listen Bisher: Collections Sammlung von Objekten Nicht notwendigerweise in einer bestimmten Reihenfolge Listen Feste Reihenfolge von Elementen Zugriff auf das n-te Element Einfügen, Löschen Wichtige (neue) Methoden get(index), remove(index), indexof(object), listiterator() Volle Referenz http://docs.oracle.com/javase/7/docs/api/java/util/list.html Security - 04 Cryptology #38 Implementierungen von java.util.list Vector Nutzt intern ein Array zur Speicherung. Gibt es seit Java 1.0 ArrayList Wie Vector, nur unsynchronisiert Nur wichtig bei nebenläufigem Zugriff LinkedList Verkettete Elemente 39

ListIterator-Interface (extends Iterator) void add(e e) boolean hasnext() boolean hasprevious() E next() int nextindex() E previous() int previousindex() void remove() void set(e e) Security - 04 Cryptology #40 ListIterator: Beispiel List<String> list1 = new ArrayList<String>(); list1.add( Test1" ); list1.add( Test2" ); list1.add( Test3" ); ListIterator<String> it = list1.listiterator(); System.out.println( it.next() ); System.out.println( it.previous() ); 41 Verwendung von List List<String> list = new ArrayList<String>(); list.add( Test"); list.add(0, Test an den Anfang"); list.add( Und hintendran"); System.out.println(list); list.remove(1); for( String s : list ) System.out.println( - + s); 42

Interne Realisierung von ArrayList Hat ein Array mit bestimmter Kapazität Speichert Größe des Arrays und Anzahl der gespeicherten Elemente Zugriff Schnell bei Zugriff auf bestimmte Elemente über einen Index Einfügen Kapazität verfügbar: schnelles Einfügen am Ende Kapazität erschöpft: Es wird ein neues, größeres Array angelegt und alle Elemente kopiert Langsam Peter capacity = 7 size = 5 6 5 4 Test 3 ein 2 ist 1 das 0 Hallo Einfügen in der Mitte: Es werden alle darüber liegenden Elemente um eins nach oben kopiert Langsam Interne Realisierung von LinkedList Klasse LinkedList selbst hält nur zwei Referenzen Auf erstes und letztes Element Jedes Datenelement hat Referenz auf Vorgänger und Nachfolger Einfügen an bestimmtem Index Suchen des n-ten Elements und einfügen durch Umbiegen der Referenzen Besonders effizient am Anfang und am Ende Klasse LinkedList (implementiert List) Referenz auf erstes Element 88 Referenz auf letztes Element 1 77 88 9 3 1 Suchen in Listen Methode indexof sucht (kleinsten) Index eines Objektes Beispiel List<Integer> list = Arrays.asList( 1, 3, 4, 1 ); int i = list.indexof( 1 ); System.out.println( i ); 45

Wie vergleicht man Objekte? Wie funktioniert der Vergleich von Objekten? == funktioniert nicht (vergleicht Objektreferenz) Zwei Interfaces in Java: Comparable, Comparator Eine Klasse implementiert Comparable Jede Instanz kann sich mit einer anderen Instanz vergleichen Eine andere Klasse implementiert Comparator Erhält zwei Objekte und vergleicht diese miteinander 46 Comparable Interface java.lang.comparable compareto(t other) liefert < 0, wenn this kleiner other > 0, wenn this größer other == 0, wenn this gleich other 47 Beispiel (ohne Sonderfälle) public class Mensch implements Comparable<Mensch> private int groesse; public int compareto(mensch other) return groesse other.groesse; 48

Comparator Interface java.util.comparator Wie compareto von java.lang.comparable Vergleicht aber zwei Objekte miteinander Vorteil: Außerhalb der Klasse implementierbar Beispiel: Verschiedene Sortierstrategien 49 Beispiel: Sortieren von Collections Hilfsklasse java.util.collections Methoden zum Sortieren von Listen Mit und ohne extra Comparator Ohne Angabe eines Comparators Das Comparable Interface wird verwendet 50 Beispiel: Kommandozeilenargumenten sortieren import java.util.*; public class Sort public static void main(string[] args) List<String> list = Arrays.asList(args); Collections.sort(list); System.out.println(list); Ausführen: java Das ist ein Test Ausgabe: [Das, Test, ein, ist] 51

Mengen in Java Mengen enthalten jedes Element genau einmal Verwenden Comparator/Comparable zur Identitätsfeststellung In Java: Interface java.util.set<t> Implementierungen: HashSet, TreeSet (Auswahl) 52 Beispiel für Set Set<String> set = new HashSet<String>(); set.add( Hallo ); set.add( Hallo ); set.add( Hallo1 ); System.out.println( Elemente: + set.size() ); for(string s : set) System.out.println( Element: + s); 53 Stacks Implementierung in Java: java.util.stack<t> Erbt von Vector Ergänzt Funktionen eines Stacks 54

Was fällt Ihnen auf bei dieser Implementierung eines Stacks? 55 Weitere wichtige Packages von Java java.lang.* java.util.* java.io.* java.net.* 56 Security - 04 Cryptology #57