The Collection Framework
- Make appropriate selection of collection classes/interfaces to suit specified behavior requirements.
- Distinguish between correct and incorrect implementations of hashcode methods.
Make appropriate selection of collection classes/interfaces to suit specified behavior requirements.
Im Package java.util gibt es verschiedene Klassen und Interfaces, die die Sammlung von Objekten in einer Gruppe zusammenfasst. Mit den Klassen und Interfaces kann man sie in diese Gruppen speichern, verändern und wieder auslesen.Einfache Collection:
Bei den einfachen Collection gibt es keine Einschränkungen bezüglich des Typs des Elementes und Reihenfolge der Elemente. Sie werden auch bag oder multiset genannt.
Diese Collection Interface wird meistens von den anderen Containerklassen (Set oder List) implementiert.
Collection-Methoden
- contains(Object o) bzw containsAll(Collection c): übeprüft, ob ein bestimmtes Objekt oder alle angegebenen Objekte enthält.
- isEmpty(): überprüft, ob Collection leer ist. Rückgabewert ist true, wenn keine Objekte vorhanden sind.
- size(): gibt die Anzahl der Objekte zurück
- iterator(): damit kann man über alle Objekte iterieren
- toArray(): gibt die Objekte in einem neuen Array zurück. Rückgabetyp ist Objekt
- add(Object o) bzw addAll(Collection c): fügt ein Objekt bzw Objekte hinzu.
- remove(Object o) bzw. removeAll(Collection c): entfernt ein Objekt bzw Objekte.
- retainAll(Collection c): entfernt alle Objekte ausser den angegebenen Objekte.
- clear(): entfernt alle Objekte aus dem Container.
Set-Interface:
wird abgeleitet von Collection-Interface, erbt dementsprechend die Methoden. Ist ebenfalls unsortiert. Der grösste Unterschied ist, dass in diesem Container keine doppelten Einträge vorhanden sind. "NULL" darf in diesem Container vorhanden sein, aber nur einmal. Set benutzt die gleichen Methoden wie das Collection-Interface.
Implementierende Klassen sind:
- SortedSet
- HashSet
- TreeSet
implementiert Set-Interface. In diesem Set sind die Elemente sortiert, d. h. die Iterator-Methode gibt ein Objekt zurück, mit dem über die Elemente in sortierte Reihenfolge iteriert werden kann. Zusätzlich gibt es die Methoden first() und last(), mit denen das erste bzw. das letzte Element abgefragt werden kann.
HashSet
implementiert ebenfalls Set-Interface, aber mit dem Unterschied, dass eine interne Hashtabelle verwendet wird. Die Methoden add()(einfügen), remove()(löschen) und contains()(Zugriff) sind effizienter als SET. Die Elemente sind aber wie bei Set-Interface ungeordnet.
TreeSet-Klasse
Diese Klasse implementiert SortedSet. In dieser Klasse sind die Elemente in aufsteigender Reihenfolge sortiert. Die Methoden add(), remove() und contains() sind effizienter.
List-Interface:
wird abgeleitet von Collection-Interface, erbt dementsprechend die Methoden. Die Elemente im List-Container sind geordnet. Es können doppelte Einträge vorhanden sein. Auf die Elemente kann über deren Index zugegriffen werden. Wie bei den Arrays ist hat das erste Element den Index 0 und das letzte Element size()-1.
Mit der Methode get() kann man ein bestimmtes Element an der angegebenen Position erfragen und mit der Methode set() setzen.
Mit den Methoden add() bzw. addAll() kann man Elemente am Ende der Liste einfügen. Diese Methoden, mit Index als Argument, fügen Elemente an den angegebenen Positionen ein.
Implementierende Klassen sind:
- ArrayList
- LinkedList
implementiert das List-Interface als Array von Elementen. Das Array wird bei Bedarf neu erzeugt, wenn das Array grösser wird. Die Methoden get() und set() sind effizienter.
LinkedList
implementiert das Interface List. Die Elemente werden als doppelt verkettete Liste gehalten. Die Methoden get() und set() sind nicht so effizienter als ArrayList, dafür sind aber die add() und remove()-methoden effizienter.
Map-Interface
Dieses Interface repräsentiert eine Ansammlung von Schlüssel-Werte-Paar-Objekten. Das heisst zu einem Schlüssel gibt es ein korrespondierendes Wertobjekt. Sowohl Schlüssel als auch Wert sind Objekte. Zu einem Schlüssel gibt es entweder kein Wert oder ein Wert. Ein Schlüssel kann nur einmal vorhanden sein. Für die Wertobjekte gibt es in dieser Hinsicht keine Einschränkungen. Beispiele für Map-Objekte sind Hashtables und assoziative Arrays. Map ist keine Collection, trotzdem gilt das Map-Interface als integraler Bestandteil von Java-Container-Framework.
Map-Methoden
- put(Objekt key, Objekt value): Zu einem Map-Objekt wird das angegebene Schlüssel-Wert-Paar hinzugefügt.
- putAll(Map m): Alle angegebenen Map-Objekte werden hinzugefügt.
- get(Objekt key): gibt das Wertobjekt zurück, welches als Argument angegeben ist.
- remove(Objekt key): entfernt aus dem Map-Objekt das Paar mit dem angegebenen Schlüssel
- clear(): löscht alle Map-Objekte.
- size(): gibt die Anzahl der Map-Objekte zurück.
- isEmpty(): gibt true zurück, wenn keine Map-Objekte vorhanden sind.
- containsKey(Objekt key): überprüft, ob das angegebene Schlüssel in dem Map-Objekt vorhanden ist.
- containsValue(Objekt value): überprüft, ob das angegebene Wert in dem Map-Objekt vorhanden ist.
- keySet(): gibt ein Set-Objekt mit allen vorhandenen in einer Map zurück.
- values(): gibt eine Collection mit allen vorhandenen Wertobjekten zurück.
- entrySet(): gibt ein Set mit allen vorhandenen Schlüssel-Wert-Paare zurück, die in diesem Map-Objekt vorhanden sind.
HashMap
Diese Klasse implementiert das Map-Interface unter Verwendung einer Hashtable. Die Methoden get() und put() sind sehr effizienter als bei Map. HashMap erlaubt null als Schlüssel.
SortedMap
Dieses Interface implementiert ein Map-Objekt. Die Schlüsselobjekte sind in einer sortierten Reihenfolge. Dieses Interface ist wie SortedSet aufgebaut.
TreeMap
Diese Klasse implementiert das Interface SortedMap. Sie ist wie TreeSet aufgebaut. Die Methoden keySet und entrySet liefern Collections, deren Iteratoren ihre Elemente in aufsteigender Reihenfolge abliefern.
Distinguish between correct and incorrect implementations of hashcode methods.
hashCode berechnet einen numerischen Wert, der als Schlüssel zur Speicherung eines Objekts in einer Hashtable verwendet werden kann. Jede Instanz von einem Objekt kann diese Methode aufrufen. Die Object-Implementation von hashCode() wandelt die Speicher-Adresse in ein Integer um. Die Methode sieht wie folgt aus:
public int hashCode()
Hier ist zu beachten, dass die Methode keine Argumente nimmt und dass der Rückgabewert ein int-Wert ist.
Wenn zwei Objekte, im Sinne der Methode equals(), gleich sind, so liefern beide Objekte den gleichen int-Wert zurück.