Home > Informatik > Einführung in die OOP > 7. ArrayList, Teil 1 > 7.2 Erzeugung eines ArrayList-Objekts

7.2 Erzeugung eines ArrayList-Objekts

Teil 1 - Teil 2 - Teil 3 - Teil 4 - Teil 5 - Teil 6 - Teil 7

7.2.1 Einführendes Beispiel

import java.util.ArrayList;

public class Stringlist
{
   private ArrayList<String> wortliste;

   public Stringlist()
   {
      wortliste = new ArrayList<>();
   }
}
Zeile 1

Damit wir Objekte der Klasse ArrayList verwenden können, muss diese Klasse zunächst aus der Java-Standardbibliothek importiert werden. Die Klasse ArrayList befindet sich im Paket java.util, daher ist die Import-Anweisung erforderlich.

Zeile 5

Hier wird das ArrayList-Objekt wortliste deklariert. Mit der Typangabe <String> wird festgelegt, dass diese Arrayliste ausschließlich Objekte der Klasse String speichern darf. Diese Schreibweise basiert auf dem Konzept der Generics.

Generics

Mit Generics kann man festlegen, welche Art von Objekten in einer Klasse oder Liste gespeichert werden darf. Bei einer ArrayList<String> sind das zum Beispiel nur Zeichenketten vom Typ String. Dadurch wird der Umgang mit solchen Listen einfacher und sicherer.

Weitere Einzelheiten und Beispiele zur generischen Programmierung in Java finden Sie auf dieser Seite im Bereich "Begriffe und Konzepte der OOP".

Java Generics – Generische Methoden, Klassen und Interfaces

Dieser Artikel stellt das Thema Generics in verständlicher Form dar und bezieht sich ebenfalls auf die Klasse ArrayList.

Die Festlegung auf einen bestimmten Datentyp (hier: String) hat sowohl Vor- als auch Nachteile.

Ein Vorteil besteht darin, dass der Datentyp der gespeicherten Elemente von vornherein feststeht. Bei wortliste wissen wir also immer, dass sich in der Liste nur String-Objekte befinden.

Der Compiler überprüft dies bereits beim Übersetzen des Programms und verhindert, dass Objekte anderer Klassen eingefügt werden. Dadurch wird der Quelltext sicherer, weniger fehleranfällig und übersichtlicher. Außerdem sind beim Auslesen der Elemente keine Typumwandlungen (Casting) erforderlich.

Ein Nachteil besteht darin, dass man mit einer solchen Liste keine heterogenen Listen anlegen kann, also keine Listen, die Objekte verschiedener Klassen enthalten.

Eine ArrayList<String> ist ausschließlich für String-Objekte geeignet.

Zeile 9

Initialisierung von wortliste. Der Diamant-Operator <> ersetzt die Angabe <String>. Dies ist ein Beispiel für Typinferenz.

Typinferenz

Typinferenz bezeichnet die Fähigkeit des Java-Compilers, den Datentyp eines Ausdrucks automatisch aus dem Kontext abzuleiten.

Vor Java 7 musste man schreiben:

ArrayList <String> wortliste = new ArrayList <String>();

Seit Java 7 kann man den Diamant-Operator verwenden:

ArrayList <String> wortliste = new ArrayList <>();

Bei der Initialisierung des ArrayList-Objekts muss also nicht mehr der Datentyp (hier <String>) angegeben werden, sondern es reicht der Diamant-Operator <>. Der Compiler erkennt dann automatisch, dass hier eine String-Arrayliste erzeugt werden soll.

Typinferenz

Weitere Einzelheiten zur Typinferenz, auch zur Verwendung des Schlüsselworts var, finden Sie auf dieser Seite.

7.2.2 Untersuchung eines neuen ArrayList-Objekts

Das Objekt wortliste im BlueJ-Objektinspektor:

Untersuchung des Stringlist-Objekts wortliste mit dem BlueJ-Objektinspektor

Im Objektinspektor sieht man bei ArrayList-Objekten wie wortliste drei interne Variablen:

1. elementData

Intern speichert ein ArrayList-Objekt seine Elemente in einem Array vom Typ Object[]. Die Einträge dieses Arrays sind Referenzen auf die gespeicherten Objekte.

Auf dieses Array hat man im normalen Programmcode keinen Zugriff, da es ein internes Implementierungsdetail ist. Debugger oder der BlueJ-Objektinspektor können es jedoch sichtbar machen.

2. size

Hier wird die aktuelle Anzahl der gespeicherten Elemente abgelegt.

Wichtig: size ist nicht identisch mit elementData.length. Die Länge des Arrays beschreibt die Kapazität, nicht die tatsächliche Anzahl der gespeicherten Elemente.

3. modCount

Mit dieser Variablen wird gezählt, wie oft die Struktur der Liste verändert wurde (z. B. durch add() oder remove()).

Diese Variable spielt eine wichtige Rolle bei sogenannten fail-fast Iteratoren. Wird eine Liste während einer Iteration strukturell verändert, kann dies zu einer ConcurrentModificationException führen.

Anmerkung zu elementData und BlueJ

Dass BlueJ elementData anzeigen kann, widerspricht nicht dem Information Hiding. Der Zugriff ist im Programmcode durch private geschützt, nicht jedoch für Debugging-Werkzeuge.

Seitenanfang
Weiter mit dem Wachstum einer Arrayliste ...