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