Programmierkurs Java Java Generics und Java API (2/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer 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 #2 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 #3 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) #4 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() ); #5 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); #6 Interne Realisierung von ArrayList capacity = 7 size = 5 • Hat ein Array mit bestimmter Kapazität – Speichert Größe des Arrays und – Anzahl der gespeicherten Elemente 6 5 • Zugriff – Schnell bei Zugriff auf bestimmte Elemente über einen Index • Einfügen – Kapazität verfügbar: schnelles Einfügen am Ende Peter 4 Test 3 ein 2 ist 1 das 0 Hallo – Kapazität erschöpft: Es wird ein neues, größeres Array angelegt und alle Elemente kopiert Langsam – Einfügen in der Mitte: Es werden alle darüber liegenden Elemente um eins nach oben kopiert Langsam #7 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) 88 Referenz auf erstes Element 1 77 88 Referenz auf letztes Element 9 3 1 #8 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 ); #9 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 #10 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“ #11 Beispiel (ohne Sonderfälle) public class Mensch implements Comparable<Mensch> { private int groesse; public int compareTo(Mensch other) { return groesse – other.groesse; } } #12 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 #13 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 #14 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] #15 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) #16 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); #17 Stacks • Implementierung in Java: java.util.Stack<T> – Erbt von Vector – Ergänzt Funktionen eines Stacks #18 • Weitere wichtige Packages von Java – – – – java.lang.* java.util.* java.io.* java.net.* #19