Collections

Werbung
Java Collections API
Jan Krüger
21.06.2011
Motivation
java.util.Collection
java.util.Map
java.util.Set
java.util.List
java.util.ArrayList
java.util.LinkedList
java.util.Hashmap
java.util.Queue
java.util.Deque
WH: Gleichheit in Java
int a = 5;
int b = 5;
System.out.println("a == b :" + (a == b));
Integer a = 5;
Integer b = 5;
System.out.println("a == b :" + (a == b));
System.out.println("a.equals(b) :"+ a.equals(b));
String a = "Hello World!";
String b = "Hello World!";
System.out.println("a == b :" + (a ==b));
System.out.println("a.equals(b) :"+ a.equals(b));
Identität vs. Gleichheit
Beispiel (1)
public class EqualsExample {
private String value;
public EqualsExample(String value) {
this.value = value;
}
public void getValue(){
return value;
}
public static void main (String [] args) {
EqualsExample a =
new EqualsExample("Hello World!");
EqualsExample b =
new EqualsExample("Hello World!");
System.out.println("a == b :"+ (a==b));
System.out.println("a.equals(b) :"+a.equals(b));
}
}
Identität vs. Gleichheit
Beispiel (2)
public class EqualsExample {
…
public boolean equals(Object b) {
if (b instanceof EqualsExample) {
return getValue().equals(
((EqualsExample)b).getValue());
}
return false;
}
public int hashCode() {
…
}
…
public static void main (String [] args) {
…
}
}
WH:Listen/Generics
LinkedList
→ LiveDemo (Material zur Vorlesung)
package de.unibi.techfak.ad2.collectionapi.list
Node,List vs. TNode,TList
Collections API
Historische Einordnung
●
●
●
dyn. Datenstrukturen seit Java 1.0
→ Vector, Hashtable
seit Java 1.2 einheitliche API
→ Collection API
Anpassungen in Java 5 durch die
Einführung von generischen Datentypen
Collections API
DesignPrinzipien
●
Schnittstellen
●
Abstrakte Basisklassen
●
Konkrete Implementierung
●
Algorithmen
Collections API
Basisschnittstellen
●
Collection oder Map
→ Basisoperationen
→ Mengenoperationen
→ Feldoperationen
Collections API
Beispiel
1: public class Example1 {
2:
3:
public static void fill (Collection <String> c){
4:
c.add("Daniel");
5:
c.add("Robert");
6:
c.add("Jan");
7:
}
8:
9:
public static void main (String [] args) {
10:
List<String> list = new LinkedList<String>();
11:
fill(list);
12:
System.out.println(list);
13:
// [Daniel, Robert, Jan]
14:
}
15: }
Collection API
Tips und guter Stil
●
Nutze immer den allgemeinsten Typ!
→ Nicht an konkrete Implementierungen
gebunden !
→ Änderungen der Datenstruktur sind
so leicht und ohne viel Aufwand zu
realisieren
Collections API
Schnittstelle Collections
java.util.Collection<E>
add(e:E) : boolean
addAll(c: Collection<?:E>):boolean
clear()
contains(o:Object):boolean
containsAll(c:Collection<?>):boolean
equals(o:Object):boolean
hashCode():int
isEmpty():boolean
iterator():Iterator
remove(o:Object):boolean
removeAll(c:Collection<?>):boolean
retainAll(c:Collection<?>):boolean
size():int
toArray():Object[]
toArray(a:T[]):T[]<T>
Collection API
Schnittstelle Collections
●
Anzeige von Veränderungen
●
Optionale Methoden
Collection<Integer> set = new HashSet<Integer>();
set.add(1);
Collection<Integer> set2 =
Collections.unmodifiableCollection(set);
set2.add(2);
//Cause a 'UnsupportedOperationException'
Collection API
Schnittstelle Collections
●
Vergleiche auf der Basis von equals()
Collection<String> col = new ArrayList<String>();
col.add("Hello World");
System.out.println(col.size());
//
1
System.out.println(col.contains("Hello World"));
//
true
col.remove("Hello World");
System.out.println(col.size());
//
0
Collection API
Schnittstelle Collection
LinkedList<String> l1 = new LinkedList<String>();
l1.addAll(Arrays.asList("Hello","World","!"));
ArrayList<String> l2 = new ArrayList<String>();
l2.addAll(Arrays.asList("Hello","World","!"));
System.out.println(l1.equals(l2)); // ???
Collection API
Erweiterungen
java.util.Collection
java.util.Map
java.util.List
java.util.Set
java.util.ArrayList
java.util.LinkedList
java.util.Hashmap
java.util.Queue
java.util.Deque
Collection API
Implementierungen
Listen (List)
ArrayList
LinkedList
Mengen (Set)
HashSet
TreeSet
LinkedHashSet
Assoziativspeicher (Map)
HashMap
TreeMap
LinkedHashMap
WeakHashMap
Schlangen (Queue)
LinkedList
ArrayBlockingQueue
PriorityQueue
Collection
Welche Implementierung?
●
Feste Ordnung ? → List
●
Schnellen Zugriff → ArrayList
●
Elemente am Anfang/Ende → LinkedList
●
Menge/Reihenfolge egal ? → HashSet
●
Menge/Sortierung wichtig ? → TreeSet
●
Schlüssel/Value Assoziation → Map
Collection
Iterator/Iterable
Collection<String> col = new ArrayList<String>();
col.addAll(Arrays.asList("Hello","World","!"));
Iterator<String> iterator = col.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
ForEach
ein erweitertes For
// typisiert
Collection<String> col = new ArrayList<String>();
col.addAll(Arrays.asList("Hello","World","!"));
for(String s : col){
System.out.println(s);
}
// untypisiert
Collection col2 = col;
for (Object o:col2){
System.out.println((String)o);
}
// NullPointer Exception
Collection<String> col3 = null;
for (String s : col3) {
System.out.println(s);
}
Utilityklassen
Collection / Arrays
→ Java API
ArrayList vs.
LinkedList
Performanzvergleich
→ LiveDemo
Herunterladen