Generics | Java | ArrayList |
- Das Interface List
- Mengen
- Assoziativer Speicher
- Interfaces
- Die Algorithmen des Java Collection Framework
- Typsicherheit durch Generics
- Video
Java bietet mit dem Java Collection Framework eine Reihe von Datencontainern an, die über die Fähigkeiten des Arrays hinausgehen. Hinzu kommen einige Funktionsbibliotheken, die unglücklicherweise Algorithmen genannt werden. Hintergrund für den Namen soll wohl die Analogie zu dem Buch Algorithmen und Datenstrukturen von Niklaus Wirth darstellen.
Interfaces
Die grundlegenden Fähigkeiten der Collections werden durch ein Interface festgelegt.
Collection
Die Basis der Interfaces des Java Collection Frameworks bildet das Interface Collection. Hier werden die abstrakten Methoden wie Hinzufügen (add), Entfernen (remove) oder Löschen (clear) deklariert, die dann später implementiert werden müssen.
Iteratoren
Die Iteratoren können als Zeiger auf die Elemente der Datenstruktur angesehen werden und ermöglichen das Durchlaufen jeder Collection, gleich welcher Art.List
Das Interface List erweitert Collection und fügt der Collection die Eigenschaft hinzu, eine Reihenfolge zu haben. Damit kann per Index ein bestimmtes Element geholt oder gesetzt werden. Auch der Iterator an eine spezielle Stelle gesetzt werden.Die wichtigsten Implementierungen von List sind
- ArrayList: Sie ist auf die Positionierung per Index optimiert. Allerdings ist es aufwängig, Elemente in der Mitte hineinzufügen oder zu entfernen.
- LinkedList: Da hier eine verkettete Liste die Basis ist, sind das Einfügen und Löschen aus der Mitte kein Problem. Auch das sequentielle Laufen ist effizient. Allerdings ist das wahlfreie Springen an bestimmte Positionen teuer.
Queue
Eine Queue ist eine Schlange. Auf der einen Seite werden Elemente hineingefügt und auf der anderen Seite werden die Elemente entnommen. Für die Implementierung verwendet man am liebsten LinkedList. Diese implementiert sowohl das Interface List als auch das Interface Queue.Set
Ein Set ist eine Menge. Hier ist nicht der schnelle Zugriff gefragt. Der besondere Wert einer Menge ist, dass keine doppelten Elemente enthalten sind.
- HashSet implementiert sehr effizient das Interface Set.
- TreeSet wird eingesetzt, wenn eine sortierte Reihenfolge wichtig ist.
Map
Das Interface Map stellt einen assoziativen Speicher zur Verfügung. Über einen Schlüssel können Sie direkt auf die zugehörigen Daten zugreifen. Ein einfaches Array verwendet eine ganze Zahl als Index auf den Speicher. Allerdings kann das Array nur ganzzahlige Schlüssel, die bei 0 beginnen und lückenlos aufsteigen. Für alles andere verwendet man besser eine Map.
Die Algorithmen des Java Collection Framework
Die Datenbehälter bringen ihre eigenen Methoden mit. Aber es gibt eine Reihe von Algorithmen, die sich auf alle Datenbehälter anwenden lassen. Beispielsweise eine Sortierung oder das Umdrehen der Reihenfolge. Zu diesem Zweck gibt es Algorithmen, die von der Klasse Collection zur Verfügung gestellt werden.Typsicherheit durch Generics
In den ersten Varianten der Container wurde Object als Stellvertreter der Elemente verwendet. Der Compiler kann aber so nicht kontrollieren, wenn ein Programmierer versehentlich das Objekt einer anderen Klasse herausholte, als er ursprünglich hineingesteckt hatte. Um die Typsicherheit zu gewährleisten, wurden mit Java 5 die Generics eingeführt.Ohne Generics verwalten die Collections einfach Objekte vom Typ Object. Da Object die Mutter aller Klassen sind, dürfen auch verschiedene Objekte hineingesteckt werden. Beim Herausholen der Objekte muss gecastet werden und es liegt in der Verantwortung des Programmierers, ob er das richtig macht.
private class Datum { int jahr, monat, tag; Datum(int j, int m, int t) { jahr=j; monat=m; tag=t; } } // ... ArrayList feld = new ArrayList(); feld.add(new Datum(1960,4,24)); feld.add(new Datum(1969,3,17)); feld.add("Anton ist doof!"); // Das gibt Ärger! for (int i=0; i<feld.size(); i++) { Datum datum = (Datum)feld.get(i); System.out.println(datum.jahr); }Durch spitze Klammern (Kleiner-, Größerzeichen) kann der ArrayList nun mitgeteilt werden, dass sie Objekte vom Typ Datum verwaltet und nicht einfach Objekte. So kann der Compiler überprüfen, ob das, was rein geht auch wieder rauskommt.
So ist es auch möglich, eine verkürzte for-Schleife speziell für Datenbehälter zu schaffen, die ohne Index einfach alle Elemente der Collection durchläuft.
ArrayList<Datum> feld = new ArrayList<Datum>(); feld.add(new Datum(1960,4,24)); feld.add(new Datum(1969,3,17)); for (Datum datum : feld) { System.out.println(datum.jahr); }
Video
Generics | Java | ArrayList |