Sammlungen Flashcards
Objektsammlungen
° Gleichartige Objekte werden oft zusammengefasst und als eigene Objekte angesehen
° Programmiersprachen stellen vordefinierte Sammlungsbausteine zur Verfügung
° Mit Sammlungen werden andere Objekte gespeichert, gemeinsam manipuliert und Mengen von Objekten an eine andere weitergegeben
° Sichten bei Objektsammlungen:
- Externe Sicht (Klientensicht): wie werden sie verwendet?
- Interne Sicht: wie werden sie realisiert?
Listen
° lineare Sammlungen von gleichartigen Elementen (Werten), in denen ein Element mehrfach auftreten kann
° sind Aneinanderreihungen von gleichartigen Werten:
- Reihenfolge der Listenelemente ist von Bedeutung
- Ein Wert kann in einer Liste mehrfach vorkommen
° Mathematische (rekursive) Definition:
- Eine Liste ist entweder eine leere Liste (notiert als [])
- Oder ien Listenelement gefolgt von einer Liste
° Listen werden sequentiell (d.h. elementweise) durchlaufen:
- Dabei wird eine Operation auf jedes Element der Liste angewendet (mit Beachtung der Reihenfolge)
° Beispielsweise eine Liste von Strings
ArrayList und LinkedList
Mengen
° untergeordnete Sammlungen von Elementen (Werten), in denen jedes Element nur einmal vorkommt
° Sammlung von gleichartigen Elementen, wobei jedes Element nur einmal vorkommt
° kann ein Element mehrfach vorkommen, spricht man von mehrfach- oder multimengen
° mathematische Mengenoperationen die gelten:
- insert: Füge ein Element zur Menge hinzu
- delete: Entferne ein Element aus der Menge
- element: Prüfe, ob ein Element in der Menge vorhanden ist
- union: Vereinige zwei Mengen zu einer neuen
- intersection: Bestimme die Schnittmenge zweier Mengen
- difference: Bestimme die Differenzmenge zweier Mengen
- empty: Prüfe, ob eine Menge leer ist
HashSet und TreeSet
Objektorientierte Sammlungen
° werden zustandsbasiert betrachtet:
- Mengen und Listen als eigenständige Objekte unabhängig von ihren Elementen
- Eine Menge ist wie ein “ungeordneter Behälter” für seine Elemente, die eingefügt und herausgenommen werden können
- Eine Liste ordnet ihre Elemente in Positionen an. Diese Ordnung kann vordefiniert oder vom Benutzer beeinflusst werden
Elemente
° Objekte, die in einer Sammlung vorhanden sind
Operationen
° mit ihnen können Elemente eingefügt und entfernt werden
Elemententyp
° wird als eine Eigenschaft der Sammlung angesehen (z.B.: Sammlung von Strings)
Kardinalität
° ist die Anzahl der enthaltenen Elemente
Kapazität
° ist die Anzahl aufnehmbarer Elemente (i.d.R. beliebig viele Elemente)
Duplikat
° Wenn ein bereits existierendes Element in eine Sammlung eingefügt wird, nennt man das einzufügende Element ein Duplikat
Schnittstelle vs. Implementation
° Eigenschaften einer Sammlungs-Schnittstelle:
- Erlaubt Duplikate?
- Kriterium einer Reihenfolge
° Eigenschaften einer Sammlungs-Implementation:
- Verwendete Datenstrukturen: Array, Verkettung, Kombination
- Effizienz: wie schnell sind einzelne Operatione ausführbar?
° Ein Klient einer Sammlung ist primär an der Schnittstelle interessiert
° Die Implementation ist meist nur zweitrangig
Umgang mit Sammlungen
° Reihenfolge der Elemente:
- Reihenfolge ist nicht definiert
- Reihenfolge ist benutzerdefiniert festgelegt
- Reihenfolge wird automatisch durch die Sammlung erstellt
° Umgangsmöglichkeiten für Duplikate:
- Duplikate sind zugelassen und erhöhen die Kardinalität
- Duplikate sind nicht zugelassen; Duplikate werden nicht eingefügt
Sammlungen in Java
° Sammlungen von Objekten werden unter Collection gefasst
° Java Collections Framerwork (JCF) bietet umfangreiche Unterstützung für Sammlungen
- Beinhaltet Interfaces und Klassen, die diese Interfaces implementieren
- wird als Teil der Sprache betrachtet
° Sammlungen enthalten keine Objekte, sondern Referenzen auf Objekte
Java API
° Java Application Programming Interface -> Bibliotek
° Beinhaltet zur eigenen Programmierung nutzbare Klassen und Interfaces
° ist in Pakete gegliedert
- enthalten Klassen
- das wichtigste Pakete: java.lang
- Interfaces gelten als Teil der Sprache (immer vorhanden)
- dazu gehört bspw. die Klasse String
Importieren von Bibliotheken
° Klassen und Interfaces aus allen anderen Paketen müssen importiert werden, um direkt benutzbar zu sein
° Java Collections Framework bspw. liegt im Paket java.util
° Import-Anweisungen stehen immer zu Anfang eriner Java-Übersetzungsenheit:
import java.util.Set;
/**
* Klassenkommentar
* …
Interface Set: zentrale Eigenschaften
° Set definiert keine Ordnung der Elemente
° Semantik von add ist so definiert, dass keine Duplikate eingefügt werden können
° Gleichheit von Elementen wird mit der Methode equals geprüft
° Formel gilt für alle e1 != e2 im Set: !e1.equalt(e2)
° Massenoperationen haben bei Sets die Bedeutung von mathematischen Mengenoperationen
s1. containsAll(s2): s2 Untermenge von s1
s1. addAll(s2): s1 = s1 vereinigt mit s2
s1. removeAll(s2): s1 = s1 - s2
s1. retainAll(s2): s1 = s1 geschnitten mit s2
equals-Methode
° jede Klasse in Java bietet automatisch alle Methoden an, die in der Klasse java.lang.Object definiert sind
° Unter anderem definiert jeder Referenztyp deshalb die Methode equals
public boolean equals(Object other)
° Jedes Objekt kann darüber mit einem anderen auf Gleichheit geprüft werden
° Parameter kann ein beliebiges Objekt sein
° vergleicht standardmäßig die Referenz des gerufenen Objektes mit der übergebenen Referenz
Redefinieren von equals
° Klassen können die vorgegebene Implementation ändern, indem sie eine alternative Implementation angeben
- > redefinieren die Operation der Klasse Object
- > Dadurch erhalten die Klienten der Klasse ein anderes Ergebnis beim Aufruf der equals-Methode: heißt bei Sammlungen, dass ein Set die Operation des Elementtyps verwendet
° Bei Redefinition von equals muss die Methode hashCode so redefiniert werden, dass sie für zwei gleiche Objekte den gleichen int-Wert als Ergebnis liefert
Einsetzen in Listen
aufsichtsliste.add(1,”Jan”); // Einfügung an Position, mit Verschieben des Restes
Erweiterte for-Schleife
/** * Gib alle Personen in der Liste auf die Konsole aus. */ public void listeAusgeben(List personenliste) { for (Person p : personenliste) // für jede Person p in der personenliste { System.out.println(p.gibName()); } }
Wrapper-Klassen in Java
° als Elementtyp für Sammlungen des Java Collection Framework sind ausschließlich Referenztypen zugelassen
° Wir können nur Objekte in einer Java Collection verwalten
° Problem: Was ist wenn wir eine Menge von ganzen Zahlen oder booleschen Werten in unserer Anwendung brauchen?
° Für jeden primitiven Typ gibt es eine so genannte Wrapper-Klasse:
int -> Integer boolean -> Boolean char -> Character long -> Long double -> Double float -> Float short -> Short byte -> Byte
Boxing und Unboxing primitiver Typen
° Wert eines primitiven Typs kann in einem Objekt des zugehörigen Wrapper-Typs verpackt werden: Integer iWrapper = new Integer(42);
° Referenz auf dieses Wert-Objekt kann dann in eine Menge eingefügt werden: Set intSet= new HashSet(); intSet.add(iWrapper);
° Über die Operationen des Wrapper-Typs kann der verpackte Wert auch wieder ausgepackt werden:
int i = iWrapper.intValue();
° Für boolesche Werte analog: Boolean bWrapper = new Boolean(true); boolean b = bWrapper.booleanValue();
Auto-Boxng und Auto-Unboxing in Java
° einpacken:
int i = 42;
Integer iWrapper = i; // Auto-Boxing
° als aktueller Parameter: Licht intList = new LinkedList(); intList.add(i);
° auspacken:
int i = iWrapper; // Auto-Unboxing
Transitivität
° Gleichheit transitiv definiert: a=b ^ b = c => a=c
Integer a = new Integer(5); int b = 5; Integer c = new Integer(5); -> Auto - Unboxing: a == b // automatisches Unboxing von a b == c // automatisches Unboxing von c jedoch: a != c