Es gibt 3 verschiedene Arten von Collections
Listen
Mengen (engl. sets)
Zuordnungen (engl. maps)
Bei Listen gibt es die
ArrayList (und Stack) basierend auf Felder (Arrays)
LinkedList, basierend auf verkettete Knoten
Man verwendet Listen-Klassen, wenn es auf eine Reihenfolge der Objekte ankommt.
Es ist eine endliche Folge von Objekten und man greift meist mit einem numerischen Index auf die Objekte zu.
ArrayList<Buch> buecher = new ArrayList<>();
Nimmt man <Katalogartikel> als Typ, können auch nur Katalogartikel eingefügt werden, selbst wenn Buch eine Spezialisierung davon ist.
Vergleicht man 2 listen mit equals() bzw. assertEquals(), dann wird geguckt, ob es beide Listen sind und die Elemente beider Listen paarweise gleich sind. (Im Sinne von equals)
Bei den Maps (Zuordnungen) gibt es immer ein Schlüssel-Wert-Paar.
Das kann als Abbildung aufgefasst werden. Wie ein Wörterbuch.
Schlüsselwert -> Wertetyp
Diese Werte können beliebige Objekte sein.
Bei Zuordnungen benutzt man put() und nicht add(), wie bei Listen.
Das macht man mithilfe eines Iterators.
Der Unterschied zwischen einer TreeMap und einer HashMap ist, dass die Schlüssel bei einer TreeMap geordent sein müssen und eine TreeMap enthält Methoden, mit denen man z.B. den kleinsten Schlüssel finden kann, der größer oder gleich dem Übergebenen Schlüssel ist.
HashMaps sind dagegen manchmal effizienter.
Verwendet man Objekte eigener Klassen als Schlüssel einer Zuordnung, MUSS man die Methoden
int hashCode() und
boolean equals(Object)
überschreiben.
In einer HashMap wird durch den Schlüssel ein Hashcode erstellt, der die Position bestimmt. Sollte es dazu kommen, dass 2 Schlüssel auf dieselbe Indexposition abbilden, wird der eine einfach an den anderen dran gehängt. Der zuerst angefügte Knoten wird nicht rausgeschmissen.
Was wird bei den beiden System.out.println() rauskommen, wenn die equals() und hashCode() Methode noch nicht überschrieben wurden?
Es kommt
Neujahrkonzert und
Null
raus. Warum?
Wurden die beiden Methoden noch nicht überschrieben, werden die equals() und hashCode() Methoden aus der Klasse Object verwendet und dort definiert man Gleichheit über Identität. Bei dem System.out.println() mit new Datum(…) wird also ein anderes Objekt erzeugt.
Wir wollen aber, dass man aufgrund der gleichen Datumsangaben auch “Tanz in den Mai” findet. Genau deshalb muss man die equals() und hashCode() Methoden in der jeweiligen Klasse überschreiben.
hashCode() für gleiche Position und equals() für Gleichheit.
Sets (Mengen)
So würde eine Menge mit Datum als Parameter aussehen. Was passiert, wenn man wie unten zu sehen nochmal versucht das gleiche Datum einzufügen?
Der neue Eintrag würde den Alten überschreiben, denn es können in einer Menge nicht 2 mal dieselben Elemente vorhanden sein.
Wichtige Methoden für Sets:
boolean add(E e)
Fügt das jeweilige Element der Menge hinzu, falls es nicht schon in der Menge ist.
boolean contains(Object o)
Gibt rue zurück, wenn das Objekt bereits in der Menge vorhanden ist.
boolean equals(Object o)
Vergleicht das Objekt mit dem Set nach Gleichheit
int hashCode()
Gibt den Hashcode Wert zurück
boolean isEmpty()
GIb true zurück, wenn das Set leer ist
Iterator<E> iterator()
Gibt einen Iterator über die Elemente in diesem Set
boolean remove(Object o)
Entfernt das angegebene Objekt aus dem Set und gibt dann true zurück, falls erfolgreich
int size()
Gibt die Größe des Sets zurück
Last changed2 years ago