„Ich bin da.“

„Hi, Ellie!“

„Heute werden wir über ein interessantes Thema sprechen. Ich werde dir von der ArrayList-Klasse erzählen.“

„Eine neue Klasse? Cool! Was kann sie?“

„Ich will dir erst etwas über den Hintergrund erzählen. Das Einzige, was Programmierer an Arrays nicht mögen, ist, dass man ihre Größe nicht verändern kann. Was tust du, wenn du drei weitere Elemente zu einem Array hinzufügen musst, das nur noch einen freien Platz hat?

„Die einzige Lösung für dieses Problem besteht darin, sehr große Arrays zu erstellen, um sicherzustellen, dass du genügend Platz für alle Elemente hast. Dies bedeutet jedoch oft eine Verschwendung von Speicherplatz. Wenn ein Array normalerweise drei Elemente enthält, aber die geringste Chance besteht, dass es 100 Elemente aufnehmen muss, musst du ein Array mit 100 Elementen erstellen.“

„Welche Lösung haben die Programmierer denn dafür gefunden?“

„Sie haben die ArrayList-Klasse geschrieben, die das Gleiche wie ein Array macht, aber seine Größe verändern kann.“

„Interessante Idee. Wie haben sie das gemacht?“

„Jedes ArrayList-Objekt speichert ein normales Array von Elementen. Wenn du Elemente aus einer ArrayList liest, liest sie diese aus ihrem inneren Array. Wenn du sie in die ArrayList schreibst, schreibt sie sie in ihr inneres Array. Hier, vergleiche einmal diese Spalten:“

Array ArrayList
Behälter für Elemente erstellen
String[] list = new String[10];
ArrayList<String> list = new ArrayList<String>();
Anzahl der Elemente abrufen
int n = list.length;
int n = list.size();
Element aus einem Array/einer Collection abrufen
String s = list[3];
String s = list.get(3);
Element in ein Array schreiben
list[3] = s;
list.set(3, s);

„Was ist denn nun an der ArrayList besser? Soweit ich das beurteilen kann, ist der Code jetzt länger.“

„Erstens unterstützt die ArrayList verschiedene zusätzliche Operationen, die Programmierer ständig durchführen müssen. Ein gewöhnliches Array unterstützt diese Operationen nicht. Zum Beispiel das Einfügen oder Löschen von Elementen aus der Mitte eines Arrays, ohne Löcher zu hinterlassen.

„Zweitens hat man die Möglichkeit, die Größe des Arrays zu ändern. Wenn du ein weiteres Element hinzufügen musst, aber das innere Array keine freien Plätze mehr hat, dann passiert in der ArrayList das hier:

a) Es wird ein weiteres Array erstellt, das 50 % größer ist als das aktuelle innere Array, plus ein Element.

b) Alle Elemente aus dem alten Array werden in das neue kopiert.

c) Das neue Array wird als inneres Array des ArrayList-Objekts gespeichert. Das alte Array wird zum Garbage erklärt (wir speichern nicht länger eine Referenz auf dieses Array).“

Array ArrayList
Ein Element am Ende des Arrays hinzufügen
Diese Aktion wird nicht unterstützt
list.add(s);
Ein Element in der Mitte des Arrays hinzufügen
Diese Aktion wird nicht unterstützt
list.add(15, s);
Ein Element am Anfang des Arrays hinzufügen
Diese Aktion wird nicht unterstützt
list.add(0, s);
Ein Element aus dem Array löschen
Wir könnten ein Element mit list[3] = null löschen. Aber das würde ein ‚Loch‘ im Array hinterlassen.
list.remove(3);
2
Aufgabe
Java Syntax,  Level 7Lektion 5
Gesperrt
Code-Eingabe
Manchmal darf man gar nicht nachdenken, man muss es einfach raushauen! Auch wenn es sich paradox anhört, manchmal „erinnern“ sich deine Finger besser als dein bewusster Verstand. Deshalb wirst du es im Rahmen der Schulung im geheimen CodeGym-Zentrum manchmal mit Aufgaben zu tun bekommen, bei denen du Code eingeben musst. Wenn du Code eingibst, gewöhnst du dich an die Syntax und sammelst ein wenig dunkle Materie. Außerdem tust du etwas gegen deine Faulheit!

„Wie arbeiten wir mit dieser ArrayList?“

„Eigentlich genau wie mit einem gewöhnlichen Array. Sieh mal. Vergleichen wir die Arbeit mit einer ArrayList mit der Arbeit mit einem Array. Angenommen, wir müssen ‚10 Zeichenketten einlesen und sie in umgekehrter Reihenfolge auf dem Bildschirm anzeigen‘.“

„Sieh dir das an:

Mit einem Array
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
String[] list = new String[10];
for (int i = 0; i < list.length; i++)
{
  String s = reader.readLine();
  list[i] = s;
}

// Display the contents of the array
for (int i = 0; i < list.length; i++)
{
  int j = list.length - i - 1;
  System.out.println( list[j] );
}
}
Mit einer ArrayList
public static void main(String[] args)
{
Reader r = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(r);

// Read strings from the keyboard
ArrayList&ltString> list = new ArrayList&ltString>();
for (int i = 0; i < 10; i++)
{
  String s = reader.readLine();
  list.add(s);
}

// Display the contents of the collection
for (int i = 0; i < list.size(); i++)
{
  int j = list.size() - i - 1;
  System.out.println( list.get(j) );
}
}

Ich habe die gleiche Farbe verwendet, um sich entsprechende Aktionen in jeder Spalte hervorzuheben.“

„Auf der einen Seite ist alles anders. Auf der anderen Seite ist es immer das Gleiche.“

„Richtig. Außer, dass wir keine eckigen Klammern verwenden, wenn wir mit einer ArrayList arbeiten. Stattdessen verwenden wir die Methoden get, set und add.“

„Ja, das habe ich gesehen. Dennoch sieht es sehr ähnlich aus.“