Programmierkurs Java - Universität zu Lübeck

Werbung
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
Herunterladen