560 likes | 797 Views
Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker. Einführung in die OOP in Java. WS 07/08. Ashraf Abu Baker baker@gdv.cs.uni-frankfurt.de. Generics. vertausche A[j] & A[j]. Generics. Generics.
E N D
Johann Wolfgang Goethe-Universität Professur für Graphische Datenverarbeitung Fachbereich Informatik und Mathematik Prof. Dr. Detlef Krömker Einführung in die OOP in Java WS 07/08 Ashraf Abu Baker baker@gdv.cs.uni-frankfurt.de Java-Intensivkurs WS07/08 Folie 1
Generics vertausche A[j] & A[j] Java-Intensivkurs WS07/08 Folie 2
Generics Java-Intensivkurs WS07/08 Folie 3
Generics • Ein Sortieralgorithmus kann Elemente beliebiger Datentypen sortieren, sofern diese paarweise vergleichbar sind (auf den Elementen ist eine Ordnungsrelation definiert • NonGenericBubbleSort beschränkt sich jedoch nur auf das Sortieren von Integer-Zahlen • Wie muss die Implementierung angepasst werden damit Elemente anderer Datentypen sortiert werden können? Java-Intensivkurs WS07/08 Folie 4
Generics • Anpassung des Algorithmus für die Sortierung von Float • Überladung der bubbelSort-Methode • Überladung und Anpassung der swap-Methode Anpassung der temp-Variable Java-Intensivkurs WS07/08 Folie 5
Generics • Wie oft müssen die Methoden bubbleSort() und swap() überladen werden? • Für die 7 unterschiedlichen primitiven Datentypen (int, long, double, …) müssten die beiden Methoden jeweils 6 Mal überladen werden • Die Klasse enthält 14 Methoden, die sich kaum Unterscheiden • Dies ist kein guter Stil einen einfachen Sortieralgorithmus zu implementieren • Lösung?? • Die Klasse BubbleSort wird als generische Klasse implementiert Java-Intensivkurs WS07/08 Folie 6
Generische Klassen Typparameter wenn A[j]<A[j-1] Java-Intensivkurs WS07/08 Folie 7
Generische Klassen Java-Intensivkurs WS07/08 Folie 8
Generische Klassen • GenericBubbleSort ist eine generische Klasse, die einen nicht näher spezifizierten Datentyps namens T verwendet • Alles was über T bekannt ist, ist dass er eine Unterklasseasse von Object ist, und das Comparable-Interface implementiert • Die Elemente von T sind daher paarweise vergleichbar Java-Intensivkurs WS07/08 Folie 9
Generische Klassen • GenericBubbleSort ist nun eine parametrisierte Klasse • Eine Klasse ist generisch, wenn sie so definiert ist, dass sie bei ihrer Instanziierung nicht primitive Datentypen als Parameter erwartet • class MyClass<TypeArgument1, TypeArgument2, …, TypArgumentn>{//class body} MyClass<Integer, String, …, StringBuffer> myClassObject=new MyClass<Integer, String, …, StringBuffer>(); • TypeArgument ist eine Abstraktion eines nicht primitiven Datentyps Java-Intensivkurs WS07/08 Folie 10
Generische Klassen //Sortierung von Integer-Zahlen //Sortierung von Double-Zahlen //Sortierung von Strings Java-Intensivkurs WS07/08 Folie 11
Generische Methoden • Auch Methoden können als generisch deklariert werden • Statt die gesamte Klasse BubbleSort als generisch zu deklarieren, könnte man nur die Methoden bubbleSort() und swap() generisch deklarieren //bubbleSort() ist nun generisch Java-Intensivkurs WS07/08 Folie 12
Generische Methoden Die Methode swap ist nun generisch Java-Intensivkurs WS07/08 Folie 13
Generics • http://angelikalanger.com/Articles/JavaMagazin/Generics/GenericsPart1.html • http://angelikalanger.com/Articles/JavaMagazin/Generics/GenericsPart2.html Java-Intensivkurs WS07/08 Folie 14
Collections (Sammlungen) Datenstrukturen • Die Effizienz eines Algorithmus hängt sehr eng mit der Wahl der richtigen Datenstruktur zusammen • Collections in Java sind Datenstrukturen, die als Container aufgefasst werden können, in denen Objekte gespeichert, verwaltet und manipuliert werden können • Den Kern des Collections-Frameworks bilden die sechs Interfaces: • Collection, List, Set, SortedSet, Map und SortedMap: Java-Intensivkurs WS07/08 Folie 15
Collections • Alle Collections außer den Maps implementieren das Collection-Interface • Das Interface stellt u. a. Methoden zum Suchen, Einfügen und Entfernen von Elementen Java-Intensivkurs WS07/08 Folie 16
Das Collection-Interface Java-Intensivkurs WS07/08 Folie 17
Listen, Mengen & Maps • Aufteilung der Collections in 3 Kategorien: • Listen (Lists) • Mengen (Sets) • Tabellen (Maps) • Listen sind Sammlungen, die dynamischen Arrays ähneln • Ihre Elemente sind geordnet und indiziert Java-Intensivkurs WS07/08 Folie 18
Listen, Mengen & Maps • Sets repräsentieren (mathematische) Mengen, die keine Duplikate zulassen • Eine Map ist eine Sammlung von Paaren • Jedes Paar besteht aus einem eindeutigen Schlüssel und einem zugehörigen Objekt (Wert) • Sind vergleichbar mit assoziativen dynamischen Arrays • Werden mithilfe von Hash-Strukturen implementiert Java-Intensivkurs WS07/08 Folie 19
Listen, Mengen & Maps • Es gibt sortierte und unsortierte bzw. geordnete und nicht geordnete Sets und Maps • Mengen- und Map-Elemente sind nicht indiziert Java-Intensivkurs WS07/08 Folie 20
Listen • Listen sind vergleichbar mit dynamisch wachsenden Arrays • Sind geordnet (sie speichert ihre Elemente in der Reihenfolge, in der sie eingefügt wurden) • Jedes Element hat einen Index • Die Indizierung fängt, wie bei Arrays, bei 0 an • Indexbasierter Zugriff auf Listenelemente ist möglich • Das Einfügen und Entfernen von Elementen an beliebiger Stelle in Listen ist möglich • Listen können null-Objekte und Duplikate speichern • Die Länge einer Liste ist theoretisch unbeschränkt Java-Intensivkurs WS07/08 Folie 21
Listen • Beispiele: • ArrayList, Vector, Stack, und LinkedList Java-Intensivkurs WS07/08 Folie 22
Listen Java-Intensivkurs WS07/08 Folie 23
ArrayList & Vector • java.lang.ArrayList und java.lang.Vector • Implementieren das List-Interface • Sie unterscheiden sich jedoch darin, dass die Methoden von Vector synchronisiert sind • Mehrere Threads auf einen Vector gleichzeitig zugreifen können ohne die Integrität der Daten zu verletzen • Vektoren Thread-sicher (thread-safe) • Aufgrund der Synchronisation sind Vektoren langsamer als ArrayLists und sollten daher nur verwendet werden, wenn mehrere Threads auf den Vektor konkurrierend zugreifen sollen • Vectors sind keine Vektoren im mathematischen Sinne sondern Listen Java-Intensivkurs WS07/08 Folie 24
ArrayListen & Vector //Listen können null-Referenzen //Ein Duplikat //Ein Duplikat Java-Intensivkurs WS07/08 Folie 25
LinkedList Java-Intensivkurs WS07/08 Folie 26
LinkedList • Eine LinkedList ist eine doppelt verkettete Liste Java-Intensivkurs WS07/08 Folie 27
LinkedList • booleanadd(E e)undbooleanoffer(E e): • Fügen das Element e am Ende der Liste ein • E remove()undE poll(): • Entfernen das erste Element in der Liste und geben es zurück • E element() und E peek(): • Liefern das erste Element in der Liste ohne es zu entfernen • Beispiel: http://www.roseindia.net/java/jdk6/LinkedListExample.shtml Java-Intensivkurs WS07/08 Folie 28
Mengen • Eine Menge ist eine in der Regel ungeordnete Sammlung von Elementen, die keine Duplikate zulässt • Bevor ein Element in eine Menge eingefügt werden kann, wird zunächst überprüft, ob es bereits darin enthalten ist • Erst wenn sichergestellt ist, dass es nicht vorhanden ist, wird es in die eingefügt Java-Intensivkurs WS07/08 Folie 29
Mengen • Im Gegensatz zu Listen ist bei Mengen ein indexbasierter Zugriff auf die Elemente nicht möglich • Es gibt sortierte und unsortierte Mengen • Die wichtigsten Mengen-Collections in Java sind HashSet , TreeSet und LinkedHashSet Java-Intensivkurs WS07/08 Folie 30
HashSet • Speichert die Elemente in einer Hashtabelle und lässt das Einfügen von null-Objekten, jedoch nicht von Duplikaten zu • Die Elemente eines HashSet sind nicht geordnet • Ein HashSet verlässt sich auf die Implementierung der hashCode()-Methode ihrer Objekte • Dies ist die Methode, die HashSet bei der Suche nach Duplikaten aufruft Java-Intensivkurs WS07/08 Folie 31
HashSet null-Objekte sind erlaubt Java-Intensivkurs WS07/08 Folie 32
LinkedHashSet • Hat die gleichen Eigenschaften wie ein HashSet • Unterschied: • LinkedHashSet sind geordnet Java-Intensivkurs WS07/08 Folie 33
TreeSet • Speichert seine Elemente in einem Rot-Schwarz-Baum • Lässt weder Duplikate noch null-Objekte zu • Erweitert Set um zahlreiche Methoden für den Umgang mit sortierten Daten: Java-Intensivkurs WS07/08 Folie 34
TreeSet null-Objekte sind erlaubt Java-Intensivkurs WS07/08 Folie 35
TreeSet Java-Intensivkurs WS07/08 Folie 36
Tabellen (Maps) • Eine Map ist eine Datenstruktur, die Schlüssel/Objekt-Paare speichert • Die Schlüssel einer Map müssen eindeutig sein und sollten die Methode hashCode() implementieren • hashCode() wird aufgerufen, wenn zwei Schlüssel auf Gleichheit überprüft werden sollen • Es gibt sortierte und unsortierte, geordnete und ungeordnete Maps Java-Intensivkurs WS07/08 Folie 37
Tabellen (Maps) • HashMap, HashTable, TreeMap und LinkedHashMap • Sie alle implementieren das Map-Interface Java-Intensivkurs WS07/08 Folie 38
Das Map-Interface Java-Intensivkurs WS07/08 Folie 39
Das Map-Interface • V put(K key, V value): • Fügt den Schlüssel key und seinen Wert in die Tabelle ein Falls ein Schlüssel bereits vorhanden ist, wird sein alter Wert durch den neuen Wert ersetztDie Methode gibt dann den alten Wert des Schlüssels zurück Wenn der Schlüssel nicht vorhanden ist, gibt die Methode null zurück • booleancontainsKey(Object key): • Gibt true zurück, wenn der Schlüssel in der Tabelle enthalten ist Java-Intensivkurs WS07/08 Folie 40
Das Map-Interface • V get(Object key): • Gibt das dem Schlüssel zugeordnete Objekt zurück, oder null, falls der Schlüssel nicht in der Tabelle enthalten ist • Set<K> keySet(): • Gibt alle Schlüssel der Tabelle als Menge zurück • Collection<V> values(): • Gibt eine Collection der Objekte in der Map zurück. In der Collection können Duplikate enthalten sein. Java-Intensivkurs WS07/08 Folie 41
HashMap und Hashtable • Beide implementiert auf der Basis einer Hashtabelle • Ihre Arbeitsweisen sind identisch • Die Methoden von HashTable sind allerdings synchronisiert und daher Thread-sicher • HashMap und Hashtable lassen null-Schlüssel und null-Objekte zu • Ihre Elemente sind nicht geordnet Java-Intensivkurs WS07/08 Folie 42
TreeMap • TreeMap implementiert das SortedMap-Interface • speichert ihre Elemente sortiert • TreeMaps lassen keine null-Schlüssel zu • Ein Schlüssel kann jedoch mit einem null-Objekt assoziiert sein Java-Intensivkurs WS07/08 Folie 43
TreeMap null-Schlüssel sind nicht erlaubt null-Werte sind erlaubt Java-Intensivkurs WS07/08 Folie 44
TreeMap Java-Intensivkurs WS07/08 Folie 45
LinkedHashMap • LinkedHashMap merkt sich die Reihenfolge, in der die Schlüssel/Wert-Paare eingefügt werden Java-Intensivkurs WS07/08 Folie 46
LinkedHashMap Java-Intensivkurs WS07/08 Folie 47
Collections-Übersicht Java-Intensivkurs WS07/08 Folie 48
Generische Collections • Vor JDK 1.5 waren alle Collection-Klassen nicht generisch • Mit der add-Methode einer nicht generischen Liste könnte man z.B. Objekte unterschiedlicher Klassen in die Liste einfügen • Collections waren daher nicht homogen Casting erforderlich Java-Intensivkurs WS07/08 Folie 49
Generische Collections • Seit Version 5 sind alle Collection-Klassen und -Interfaces generisch und somit homogen • Zugriffe auf Elemente erfordern kein Casting mehr: Casting ist nicht erforderlich Java-Intensivkurs WS07/08 Folie 50