Listen, Arrays und Strings in Java

Lerne, viele Werte in Java zu speichern und Text zu verarbeiten. Erstelle ArrayLists und Arrays, füge Elemente hinzu, ändere, entferne und suche sie und verarbeite sie mit indexbasierten Schleifen und for-each-Schleifen, um Summen, Mittelwerte und Maxima zu berechnen. Verarbeite anschließend Text mit String-Methoden: Finde und extrahiere Teile, teile Zeilen in Datenfelder auf, vergleiche Strings korrekt mit equals und baue längere Texte effizient mit StringBuilder auf.

AnfängerEinheit 4 von 11 in Kurs: Java-Programmierung – Klassen, Vererbung, Collections und Streams

Was du lernst

  1. Erstelle ArrayLists, füge Elemente hinzu, lies, ersetze und entferne sie, prüfe den Inhalt einer Liste und verstehe, was passiert, wenn eine Liste gemeinsam genutzt oder an eine Methode übergeben wird.
    • Erstelle eine Liste und greife über Indizes auf ihre Elemente zu
      Importiere und erstelle eine ArrayList, füge Elemente hinzu, lies und ersetze sie über ihren Index und bleibe im gültigen Indexbereich.
    • Entferne Elemente und prüfe den Inhalt einer Liste
      Entferne Elemente nach Index oder Wert, finde Werte mit contains und indexOf und vermeide die Fallstricke bei Integer-Listen und sich verschiebenden Indizes.
    • Verwende Listen gemeinsam über Variablen und Methoden
      Erkläre, was eine Listenvariable enthält, was beim Zuweisen oder Übergeben einer Liste an eine Methode passiert und wie du eine Liste kopierst und zwei Listen vergleichst.
  2. Erstelle Arrays, lies und schreibe ihre Elemente, übergib und kopiere sie korrekt und wähle zwischen einem Array und einer ArrayList.
    • Erstelle Arrays und greife auf ihre Elemente zu
      Deklariere und erstelle Arrays, fülle sie, lies und schreibe Elemente über ihren Index und kenne ihre Länge, Standardwerte und Ausgabe.
    • Übergib, kopiere und vergleiche Arrays und wähle zwischen Arrays und Listen
      Erkläre Array-Referenzen, kopiere und vergleiche Arrays korrekt, vertausche Elemente und entscheide, wann ein Array oder eine ArrayList zur Aufgabe passt.
  3. Durchlaufe alle Elemente mit indexbasierten Schleifen und for-each-Schleifen, berechne Summen, Mittelwerte und Extremwerte, suche nach Werten und ändere eine Liste sicher, während du sie durchläufst.
    • Durchlaufe Listen und Arrays mit for- und for-each-Schleifen
      Schreibe indexbasierte Schleifen und for-each-Schleifen über Listen, Arrays und die Zeichen eines Strings und wähle die passende Schleife für die Aufgabe.
    • Berechne Summen, Mittelwerte, Anzahlen und Extremwerte
      Verwende Akkumulatorvariablen, um Summen, Mittelwerte, Anzahlen, Maxima und Minima zu berechnen, und erstelle eine gefilterte Liste.
    • Suche in einer Liste oder einem Array nach einem Wert
      Schreibe lineare Suchen, die eine Position, eine Ja-Nein-Antwort oder alle Treffer zurückgeben, und suche nach einer Bedingung statt nach einem genauen Wert.
    • Ändere eine Liste sicher, während du sie durchläufst
      Entferne oder ergänze Elemente während einer Schleife, ohne Elemente zu überspringen oder eine Ausnahme auszulösen, und wähle dafür einen sicheren Weg.
  4. Betrachte einen String als Zeichenfolge, finde und extrahiere Teile, bereinige ihn und wandle Textzeilen in Daten und wieder zurück um.
    • Lies die Zeichen eines Strings aus
      Verwende length und charAt, durchlaufe Zeichen, arbeite mit char-Werten, verknüpfe Text mit + und verstehe, dass Strings nicht verändert werden können.
    • Finde, extrahiere und bereinige Teile eines Strings
      Finde Text mit indexOf und contains, extrahiere Teile mit substring und ändere Groß- und Kleinschreibung, Leerzeichen und Inhalt mit replace, trim und verwandten Methoden.
    • Teile Text auf und wandle Text in Zahlen um
      Teile eine Zeile mit split in Datenfelder auf, wandle Datenfelder in Zahlen und Zahlen in Text um, prüfe die Teile und füge sie wieder zusammen.
  5. Vergleiche Strings nach Inhalt und alphabetischer Reihenfolge und verwende StringBuilder, um Text schrittweise aufzubauen und zu bearbeiten.
    • Vergleiche Strings mit equals und compareTo
      Prüfe Inhalte mit equals und equalsIgnoreCase, vermeide die ==-Falle und null-Fehler und verwende compareTo, um Strings zu ordnen.
    • Baue Text mit StringBuilder auf und bearbeite ihn
      Verwende StringBuilder, um Text in einer Schleife aufzubauen und direkt zu bearbeiten, wandle das Ergebnis in einen String um und vermeide häufige Fehler mit StringBuilder.

Listen, Arrays und Strings in Java einfach erklärt

5 Kapitel

1

Speichere und verwalte Daten in einer ArrayList

Eine ArrayList hält zusammengehörige Werte in einer geordneten Collection, auch wenn du die endgültige Anzahl nicht kennst. Beginne mit dem Erstellen einer typisierten Liste und füge dann Elemente ein, ersetze, entferne und finde sie anhand ihres Index oder Werts. Verfolge anschließend, was passiert, wenn zwei Variablen oder eine Methode diese Liste gemeinsam nutzen. So kannst du entscheiden, ob du vorhandene Daten änderst oder ein separates Ergebnis erstellst.

1.1 Erstelle und bearbeite eine ArrayList

Eine ArrayList speichert Werte in einer Reihenfolge. Sie wächst, wenn du ein Element hinzufügst, und schrumpft, wenn du eines entfernst. Jedes Element hat einen Index, beginnend bei 0. Importiere die Klasse, bevor du sie verwendest: import java.util.ArrayList;.

Erstelle eine typisierte Liste
ArrayList<String> drinks = new ArrayList<>();
drinks.add("tea");
drinks.add("milk");

Der Typ in <String> gibt an, was die Liste speichert. Durch die Diamant-Syntax <> rechts kann Java denselben Typ ableiten. Die Liste beginnt leer mit der Größe 0; nach diesen beiden Aufrufen enthält sie [tea, milk] und hat die Größe 2. Wenn du die Liste direkt ausgibst, zeigt sie ihre Elemente: System.out.println(drinks);.

Der Elementtyp einer Liste muss ein Klassentyp sein. Verwende für Zahlen eine Wrapperklasse: Integer für int, Double für double, Boolean für boolean oder Character für char. ArrayList<int> lässt sich nicht kompilieren. Bei ArrayList<Integer> numbers = new ArrayList<>(); funktioniert numbers.add(5), weil Java den int automatisch in einen Integer umwandelt. Beim Einlesen in int n = numbers.get(0); wird der Wert wieder ausgepackt.

Verfolge jede Indexänderung
String old = drinks.set(0, "coffee");
drinks.add(1, "water");
String last = drinks.get(2);

set(0, "coffee") ersetzt das erste Element und gibt den alten Wert zurück, daher ist old gleich "tea". Die Größe bleibt 2. Das Einfügen von "water" an Index 1 verschiebt "milk" nach rechts. Die Liste ist nun [coffee, water, milk]; last ist "milk" und die Größe ist 3.

AufgabeAufrufGültiger Index
Element lesenget(i)0 bis size() - 1
Element ersetzenset(i, value)0 bis size() - 1
Element einfügenadd(i, value)0 bis size()
Element anhängenadd(value)Kein Index nötig

Der zusätzlich erlaubte Einfügeindex ist die Position direkt nach dem aktuellen letzten Element. Bei dieser Liste hängt add(3, "juice") einen Wert an, aber get(3) würde vor diesem Einfügen fehlschlagen. Ein ungültiger Index löst eine IndexOutOfBoundsException aus. Verwende get(size() - 1) für das letzte Element, nachdem du geprüft hast, dass die Liste nicht leer ist.

Beginne mit Daten oder sammle Eingaben

Mit import java.util.List; erstellt new ArrayList<>(List.of("red", "green", "blue")) eine veränderbare Liste mit diesen Werten. List.of(...) allein erstellt eine nicht modifizierbare Liste: add, set und remove lösen eine UnsupportedOperationException aus. Du wirst auch List<String> names = new ArrayList<>(); sehen; die Variable mit dem allgemeinen Typ List unterstützt diese Listenmethoden ebenfalls.

Um Zeilen bis zu einer leeren Zeile zu sammeln, verwende einen Scanner namens scanner und eine leere Liste namens lines:

while (true) {
    String line = scanner.nextLine();
    if (line.isEmpty()) {
        break;
    }
    lines.add(line);
}

Die Zeile zum Beenden wird vor dem Hinzufügen geprüft und daher nicht gespeichert. lines.size() zählt die gespeicherten Zeilen. lines.isEmpty() prüft, ob keine vorhanden sind, und lines.clear() entfernt sie alle, wenn du die Liste erneut verwenden möchtest.

Wichtige Erkenntnisse

  • Indizes beginnen bei 0; das letzte Element steht an size() - 1.
  • set ersetzt; add mit Index fügt ein und verschiebt spätere Elemente.
  • Verwende in einer ArrayList Wrappertypen wie Integer.
  • Kopiere List.of(...) in eine ArrayList, wenn die Liste veränderbar sein muss.
  • clear() entfernt alle Elemente; eine leere Liste hat die Größe 0.

1.2 Entferne Werte und finde ihre Positionen

Das Entfernen eines Elements ändert sowohl die Größe als auch die Indizes der späteren Elemente. Eine Suche zeigt, ob ein Wert vorhanden ist oder wo er jetzt steht. Halte den Unterschied zwischen einem Wert und seiner Position klar, besonders in einer Liste von Ganzzahlen.

Zwei Bedeutungen von remove
AufrufBedeutungRückgabewert
remove(int index)Entfernt das Element an einer PositionDas entfernte Element
remove(Object value)Entfernt den ersten gleichen Werttrue bei Entfernung, sonst false

Für [coffee, water, milk] gibt remove(0) den Wert "coffee" zurück und hinterlässt [water, milk]. Der alte Index 2 für "milk" ist nun ungültig; dieser Wert ist an Index 1 gerückt. Ein gespeicherter Index ist nur nützlich, solange Änderungen die damit beschriebenen Positionen nicht verschoben haben.

Entfernen nach Wert bedeutet nicht, dass jeder Treffer entfernt wird. Ausgehend von [a, b, a] hinterlässt remove("a") die Liste [b, a]. Ein zweiter Aufruf entfernt das verbliebene "a". Das Entfernen eines fehlenden Werts gibt false zurück und lässt die Liste unverändert, sodass du das Ergebnis direkt verwenden kannst:

boolean removed = names.remove("Lena");
if (removed) {
    System.out.println("Name removed");
}
Die Überladungsfalle bei Ganzzahlen

Ein int-Argument wählt die Indexform, selbst wenn die Liste Ganzzahlen speichert:

ArrayList<Integer> numbers = new ArrayList<>(List.of(10, 20, 30));
int removed = numbers.remove(1);
boolean found = numbers.remove(Integer.valueOf(10));

Der erste Aufruf entfernt das Element an Index 1, daher ist removed gleich 20 und die Liste wird zu [10, 30]. Der zweite Aufruf übergibt ausdrücklich ein Integer-Objekt. Er entfernt den Wert 10, setzt found auf true und hinterlässt [30]. Ein Aufruf von remove(10) auf der ursprünglichen Liste mit drei Elementen würde Index 10 verwenden und eine IndexOutOfBoundsException auslösen.

Wähle ein Suchergebnis

Für colors = [red, green, blue, green] ist contains("green") gleich true, indexOf("green") gleich 1 und lastIndexOf("green") gleich 3. contains liefert eine Ja-Nein-Antwort. Die beiden Indexmethoden liefern die erste oder letzte Position eines Treffers. Ein fehlender Wert ergibt entsprechend false oder -1.

Diese Methoden vergleichen Elemente mit equals. String-Inhalte müssen einschließlich der Groß- und Kleinschreibung genau übereinstimmen: indexOf("Green") ist für diese Liste -1. Für eine Suche ohne Beachtung der Groß- und Kleinschreibung kann eine Schleife jeden Namen mit equalsIgnoreCase vergleichen.

Ein Treffer an Index 0 ist ebenfalls ein Treffer. Die Prüfung indexOf(x) > 0 übersieht ihn. Wenn du die Position brauchst, prüfe ausdrücklich auf die Kennzeichnung für einen fehlenden Wert:

int index = colors.indexOf("red");
if (index != -1) {
    colors.remove(index);
}

Hier gibt die Suche 0 zurück, die Prüfung ist erfolgreich, und das Entfernen an Index 0 hinterlässt [green, blue, green]. Um doppelte Namen zu vermeiden, prüfe vor dem Hinzufügen: if (!names.contains(name)) { names.add(name); }. Um alle Vorkommen zu entfernen, kannst du das Entfernen wiederholen, solange contains true ergibt, oder eine sichere rückwärts gerichtete Schleife verwenden. Eine vorwärts gerichtete Schleife, die nach dem Entfernen immer weiterzählt, kann ein verschobenes Element überspringen.

Wichtige Erkenntnisse

  • remove(index) gibt ein Element zurück; remove(value) gibt einen booleschen Wert zurück.
  • Verwende für einen Ganzzahlwert remove(Integer.valueOf(x)).
  • Beim Entfernen rücken spätere Elemente eine Position nach links.
  • indexOf und lastIndexOf geben für einen fehlenden Wert -1 zurück; 0 bedeutet gefunden.
  • String-Suchen beachten die Groß- und Kleinschreibung und vergleichen Inhalte.
  • Das Entfernen nach Wert entfernt nur den ersten Treffer.

1.3 Verstehe gemeinsam genutzte Listen und Kopien

Eine Listenvariable enthält eine Referenz auf ein Objekt. Sie enthält nicht alle Elemente in der Variable selbst. Das erklärt, warum das Ändern einer Liste über einen Namen einen anderen Namen betreffen kann und warum die Zuweisung an einen Parameter eine andere Wirkung hat als das Bearbeiten seiner Elemente.

Verfolge die Referenzen
ArrayList<String> original = new ArrayList<>(List.of("tea"));
ArrayList<String> alias = original;
ArrayList<String> copy = new ArrayList<>(original);
alias.add("milk");
copy.add("juice");

original und alias zeigen auf eine Liste. Nach dem Hinzufügen über alias zeigen beide [tea, milk]. Die Kopie ist eine separate Liste, die vor diesem Hinzufügen erstellt wurde, und enthält daher [tea, juice]. Zwei Namen für ein Objekt heißen Aliasse. Eine Zuweisung kopiert eine Referenz; der Kopierkonstruktor erstellt eine neue Liste und kopiert die Elemente hinein.

Die kopierte Liste enthält Referenzen auf dieselben Elementobjekte. Bei Strings und Wrapperwerten können diese Elementobjekte nicht verändert werden, sodass das Ersetzen eines Listenplatzes nicht den Platz in der anderen Liste ändert. Das Kopieren einer Liste reicht aus, damit diese beiden Listen unabhängig voneinander Elemente hinzufügen, entfernen und ersetzen können.

Eine Methode erhält eine Kopie der Referenz

Java übergibt Argumente als Wert. Bei einer Liste ist dieser Wert eine Referenz. Der Aufrufer und der Parameter zeigen zunächst auf dieselbe Liste:

static void addBonus(ArrayList<Integer> scores, int bonus) {
    for (int i = 0; i < scores.size(); i++) {
        scores.set(i, scores.get(i) + bonus);
    }
}

Der Aufruf addBonus(scores, 5) auf [70, 85] ändert die Liste des Aufrufers zu [75, 90]. Die Methode muss keine Liste zurückgeben, weil sie das gemeinsam genutzte Objekt bearbeitet. Die Zuweisung scores = new ArrayList<>(); innerhalb der Methode lässt dagegen nur ihren lokalen Parameter auf die neue Liste verweisen. Die Variable des Aufrufers zeigt weiterhin auf die alte Liste.

Ein int-Parameter erhält eine kopierte Zahl. Das Ändern dieses Parameters kann die int-Variable des Aufrufers nicht ändern. In beiden Fällen ist der Parameter lokal; der Unterschied besteht darin, ob sein Wert zu einem gemeinsam genutzten veränderlichen Objekt führt.

Gib neue Daten zurück, wenn die Aufgabe es verlangt
static ArrayList<String> longWords(ArrayList<String> words, int minLength) {
    ArrayList<String> result = new ArrayList<>();
    for (String word : words) {
        if (word.length() >= minLength) {
            result.add(word);
        }
    }
    return result;
}

Die Methode liest words und schreibt nur in result, sodass die Eingabe unverändert bleibt. Eine Methode, die ein Argument ändert, sollte dieses Verhalten vermitteln, wie es addBonus tut. Bei einer Methode, die neue Daten zurückgibt, lässt sich die Ausgabe leichter getrennt von der Eingabe prüfen.

Vergleiche Inhalte und behandle fehlende Ergebnisse

a == b prüft, ob zwei Listenreferenzen auf dasselbe Objekt zeigen. a.equals(b) prüft, ob die Listen gleich groß sind und gleiche Elemente in derselben Reihenfolge enthalten. Zwei getrennt erstellte Listen [1, 2] haben gleiche Inhalte, aber unterschiedliche Identitäten; [2, 1] hat in der Listenreihenfolge keinen gleichen Inhalt.

Eine leere Liste ist ein tatsächliches Objekt mit der Größe 0. Eine Schleife darüber wird nullmal ausgeführt, aber get(0) schlägt fehl, weil es keine Elementindizes gibt. null bedeutet, dass kein Listenobjekt vorhanden ist; selbst size() löst dann eine NullPointerException aus. Eine Methode ohne Treffer kann eine leere Ergebnisliste zurückgeben, sodass der Aufrufer das Ergebnis normal durchlaufen kann.

Wichtige Erkenntnisse

  • Eine Zuweisung führt zur gemeinsamen Nutzung einer Liste; new ArrayList<>(original) erstellt eine separate Liste.
  • Eine Methode kann die Liste des Aufrufers über eine kopierte Referenz bearbeiten.
  • Die Neuzuweisung eines Parameters ändert nicht, worauf die Variable des Aufrufers zeigt.
  • equals vergleicht bei Listen den Inhalt in seiner Reihenfolge; == vergleicht die Identität.
  • Eine leere Liste lässt sich durchlaufen; null verweist auf keine Liste.
2

Speichere Daten mit fester Elementanzahl in Arrays

Arrays geben jedem Wert einen nummerierten Speicherplatz in einer Struktur, deren Länge fest bleibt. Erstelle und fülle diese Speicherplätze, lies ihre Standardwerte und gib ihre Inhalte übersichtlich aus. Beim Kopieren, Vergleichen, Vertauschen und Übergeben von Arrays an Methoden musst du verstehen, welche Variablen auf dasselbe Objekt verweisen. Nutze diese Kenntnisse, um für eine bestimmte Aufgabe ein Array oder eine ArrayList zu wählen.

2.1 Erstelle Arrays mit festen Speicherplätzen

Ein Array speichert eine feste Anzahl von Elementen eines Typs. Du wählst seine Länge beim Erstellen. Elemente können sich ändern, aber die Anzahl der Speicherplätze in diesem Array bleibt gleich. Arrays können primitive Werte direkt speichern.

Erstelle und fülle Speicherplätze
int[] scores = new int[5];
scores[0] = 90;
int first = scores[0];
int[] primes = {2, 3, 5, 7, 11};

new int[5] erstellt fünf Speicherplätze. Ihre Indizes sind 0, 1, 2, 3 und 4. Mit eckigen Klammern liest und schreibst du einen Speicherplatz, sodass first den Wert 90 erhält. Der Initialisierer für primes erstellt und füllt fünf Speicherplätze. Wenn ein gefülltes Array als Ausdruck benötigt wird, etwa als Methodenargument, verwende new int[] {2, 3, 5}.

Die Länge ist ein Feld: scores.length, ohne Klammern. Es zählt alle Speicherplätze, auch diejenigen, denen du selbst noch keinen Wert zugewiesen hast. Das Hinzufügen eines Werts an Speicherplatz 0 ändert die Länge nicht von 5 auf 1.

StrukturAnzahl der ElementeElement lesen
Arraya.lengtha[i]
ArrayLista.size()a.get(i)
Strings.length()s.charAt(i)

Diese Namen sind nicht austauschbar. Ein Array hat keine Methode size(), und bei einem String braucht length Klammern.

Kenne die Startwerte

Neue Array-Speicherplätze erhalten Standardwerte. Arrays primitiver Zahlentypen beginnen mit null: 0 für int, 0,0 für double. Ein boolean[] beginnt mit false; ein char[] beginnt mit dem Zeichen, dessen Code null ist, geschrieben als '\u0000'. Arrays von Klassentypen, einschließlich String[], beginnen mit null-Referenzen.

String[] words = new String[3];
words[0] = "sun";
System.out.println(words[0].length());

Dies gibt 3 aus, weil Speicherplatz 0 nun auf "sun" verweist. Die Speicherplätze 1 und 2 enthalten weiterhin null. Der Aufruf von words[1].length() löst eine NullPointerException aus: Dort steht noch kein String. Ein standardmäßig mit null belegter Speicherplatz unterscheidet sich von einem leeren String "", der ein Objekt mit der Länge 0 ist.

Lies Ausgaben und bleibe innerhalb des Arrays

Importiere java.util.Arrays und verwende System.out.println(Arrays.toString(scores));, um [90, 0, 0, 0, 0] auszugeben. Die direkte Ausgabe von scores zeigt einen Typ- und Identitätscode wie [I@1b6d3586, nicht die Elemente. Der Identitätscode ist keine brauchbare Darstellung der gespeicherten Zahlen.

Für eine Woche mit Temperaturen in Grad Celsius:

double[] temps = {12.5, 14.0, 9.5, 11.0, 15.5, 13.0, 10.5};
temps[2] = 10.0;

Der Messwert des dritten Tages ändert sich von 9,5 auf 10,0. Der erste Messwert ist temps[0]; der letzte ist temps[6] oder temps[temps.length - 1]. temps[7] liegt außerhalb des Arrays. Java löst bei einem ungültigen Array-Index eine ArrayIndexOutOfBoundsException aus. Verwende in einer indexbasierten Schleife i < temps.length: i <= temps.length versucht, einen zusätzlichen Speicherplatz nach dem letzten gültigen zu lesen. Ein Array der Länge null hat überhaupt keine gültigen Elementindizes.

Wichtige Erkenntnisse

  • Die Array-Länge wird beim Erstellen des Arrays festgelegt.
  • Verwende a[i], um einen Speicherplatz zu lesen oder zu beschreiben, und a.length, um Speicherplätze zu zählen.
  • Neue numerische Speicherplätze enthalten null; neue String-Speicherplätze enthalten null.
  • Arrays.toString(a) gibt den Inhalt aus.
  • Der letzte gültige Index ist a.length - 1.

2.2 Kopiere und vergleiche Arrays und vertausche ihre Elemente

Eine Array-Variable enthält genau wie eine Listenvariable eine Referenz. Die Zuweisung dieser Referenz erzeugt einen weiteren Namen für dasselbe Array. Eine separate Kopie benötigt ein neues Array-Objekt, und für den Inhaltsvergleich brauchst du eine Methode, die die Speicherplätze prüft.

Zuweisen und Kopieren
int[] a = {4, 9, 2};
int[] alias = a;
int[] copy = Arrays.copyOf(a, a.length);
alias[0] = 99;

Nun zeigen a und alias beide [99, 9, 2]; copy zeigt weiterhin [4, 9, 2]. Arrays.copyOf(a, a.length) erstellt ein neues Array derselben Länge. Auch a.clone() kann es kopieren. Importiere java.util.Arrays für die Hilfsmethoden.

Eine andere angeforderte Länge ändert das neue Array, nicht das alte. Arrays.copyOf(new int[] {2, 3, 5}, 4) ergibt [2, 3, 5, 0]. Zusätzliche Speicherplätze erhalten Standardwerte. Damit eine Variable auf ein größeres Array verweist, weise ihr die zurückgegebene Kopie zu. Jeder Alias des Originals verweist weiterhin auf das alte Array.

Methodenaufrufe nutzen das Objekt gemeinsam
static void doubleAll(int[] values) {
    for (int i = 0; i < values.length; i++) {
        values[i] = values[i] * 2;
    }
}

Der Parameter erhält eine Kopie der Referenz. Daher ändert die Methode die Array-Speicherplätze des Aufrufers. Eine Neuzuweisung von values zu einem neuen Array würde nur den Parameter ändern. Eine Methode kann stattdessen ein neues Array zurückgeben: return new int[] {values[0], values[values.length - 1]}; erzeugt für die Eingabe {4, 9, 2} den Wert [4, 2]. Dieser Ausdruck benötigt eine nicht leere Eingabe, weil er zwei Indizes liest.

Inhaltliche Gleichheit ist bei Arrays anders

Für getrennt erstellte Arrays a = {1, 2} und b = {1, 2} sind sowohl a == b als auch a.equals(b) false: equals prüft bei Arrays die Identität. Arrays.equals(a, b) ist true, weil die entsprechenden Elemente übereinstimmen. Das unterscheidet sich von ArrayList, deren equals den Inhalt in seiner Reihenfolge vergleicht.

Speichere einen Wert vor dem Überschreiben

Um zwei Positionen zu vertauschen, halte einen alten Wert in einer temporären Variable fest:

int temp = a[0];
a[0] = a[2];
a[2] = temp;

Ausgehend von {4, 9, 2} speichert die erste Zeile den Wert 4. Die zweite ergibt [2, 9, 2]. Die dritte stellt die gespeicherte 4 an Index 2 wieder her und vervollständigt [2, 9, 4]. Ohne temp würde die Zuweisung a[2] = a[0] nach der zweiten Zeile erneut 2 kopieren und die ursprüngliche 4 ginge verloren.

Wähle eine Struktur, die zu den Daten passt
BedarfGeeignete Wahl
Ein fester Speicherplatz für jeden Tag oder MonatArray
Primitive Werte ohne WrapperArray
Elemente hinzufügen oder entfernen, während Eingaben eintreffenArrayList

Arrays kommen auch in main(String[] args) und als Ergebnis von String.split vor. Für ein String[] words erstellt new ArrayList<>(Arrays.asList(words)) eine Liste, die wachsen kann. Erstelle für ein int[] eine ArrayList<Integer> und füge jede Ganzzahl in einer Schleife hinzu. Arrays.asList behandelt bei dem primitiven Array das gesamte Array als ein Element und erstellt daher keine Liste seiner einzelnen Zahlen.

Wichtige Erkenntnisse

  • Eine Array-Zuweisung führt zur gemeinsamen Nutzung desselben Objekts; copyOf oder clone erstellt eine Kopie.
  • Verwende Arrays.equals für Array-Inhalte.
  • Eine Methode kann gemeinsam genutzte Array-Speicherplätze über ihren Parameter ändern.
  • Eine temporäre Variable bewahrt beim Vertauschen einen Wert auf.
  • Verwende Arrays für feste Speicherplätze und ArrayLists für veränderliche Anzahlen.
  • Wandle ein primitives Array mit einer Schleife in eine Wrapperliste um.
3

Verarbeite Listen und Arrays mit Schleifen

Schleifen machen aus gespeicherten Werten nützliche Ergebnisse: eine Summe, eine Anzahl, einen Extremwert, eine gefilterte Collection oder ein Suchergebnis. Wähle anhand dessen, ob du Werte oder Positionen brauchst, wie du die Elemente durchläufst. Verfolge den sich ändernden Zustand jeder Schleife, um leere Daten zu behandeln, Nachkommateile bei Mittelwerten zu erhalten, eine Suche zum richtigen Zeitpunkt zu beenden und Werte zu entfernen, ohne verschobene Elemente zu übersehen.

3.1 Wähle eine indexbasierte Schleife oder eine for-each-Schleife

Mit einer Schleife kann ein Stück Code jedes Element verarbeiten. Die Wahl hängt davon ab, was der Schleifenrumpf braucht: nur einen Wert, seine Position oder eine Möglichkeit, in die Collection zurückzuschreiben. Sowohl Arrays als auch ArrayLists unterstützen indexbasierte Schleifen und for-each-Schleifen.

Durchlaufe Werte der Reihe nach
for (String task : tasks) {
    System.out.println(task);
}

Lies dies als „für jede Aufgabe in tasks“. Bei [shop, cook, clean] gibt die Schleife die drei Strings in dieser Reihenfolge aus. Die Schleifenvariable hat den Elementtyp. Verwende bei ArrayList<Integer> den Typ int, um für jeden Wert Unboxing auszuführen, oder Integer, um die Wrapperreferenz zu behalten. Bei String-Zeichen durchläuft for (char c : word.toCharArray()) die char-Werte.

Eine for-each-Schleife stellt keinen Index bereit. Wenn du nummerierte Zeilen brauchst, verwende eine indexbasierte Schleife:

for (int i = 0; i < tasks.size(); i++) {
    System.out.println((i + 1) + ". " + tasks.get(i));
}

Der Index beginnt bei 0, aber die angezeigte Zeilennummer beginnt bei 1. Die Klammern sorgen dafür, dass i + 1 addiert wird, bevor das Ergebnis Teil des Texts wird. Ändere bei einem Array die Bedingung zu i < tasks.length und lies tasks[i]. Eine while-Schleife kann dieselbe Aufgabe erledigen, indem sie vor der Schleife einen Zähler initialisiert und ihn im Rumpf erhöht.

Schreibe über eine Position zurück
int[] nums = {4, 9, 2};
for (int n : nums) {
    n = n * 2;
}

Dies lässt das Array unverändert. Jeder Durchlauf legt eine Kopie eines primitiven Werts in n ab; eine Zuweisung an diese lokale Variable schreibt nicht in den ursprünglichen Speicherplatz. Um das Array zu ändern:

for (int i = 0; i < nums.length; i++) {
    nums[i] = nums[i] * 2;
}

Das Ergebnis ist [8, 18, 4]. Für eine Ganzzahlliste lautet die entsprechende Aktualisierung list.set(i, list.get(i) * 2). Der Index sagt Java, welches gespeicherte Element ersetzt werden soll.

Passe die Schleifengrenzen an den Rumpf an

Für die rückwärts gerichtete Traversierung einer Liste beginne bei tasks.size() - 1, fahre fort, solange i >= 0 gilt, und verwende i--. So werden clean, cook und dann shop durchlaufen. Um jedes zweite Element auszuwählen, kannst du in einer vorwärts gerichteten Schleife i += 2 verwenden.

Nachbarvergleiche benötigen einen kürzeren Bereich. Wenn der Rumpf sowohl list.get(i) als auch list.get(i + 1) liest, lautet die Bedingung i < list.size() - 1. Die letzte gültige Startposition ist das vorletzte Element. Mit der üblichen Bedingung für das vollständige Durchlaufen würde die Schleife versuchen, nach dem letzten Element einen nicht vorhandenen Nachbarn zu lesen.

Wenn du zwei gleich lange Listen gemeinsam verarbeitest, greife mit einem Index auf beide zu. Zum Beispiel bezeichnen names.get(i) und scores.get(i) die einander entsprechenden Einträge. Eine for-each-Schleife ist einfacher, wenn die Position keine Rolle spielt, etwa beim Ausgeben jedes Namens oder beim Addieren jedes Werts zu einer Summe.

Ein Start bei 1 überspringt unbemerkt das erste Element. Mit <= size() oder <= length wird ein zusätzlicher ungültiger Index verwendet. Eine leere Liste oder ein leeres Array braucht keine besondere Regel für das Durchlaufen: Die Anfangsbedingung ist false, sodass der Rumpf nullmal ausgeführt wird. Jeder anschließende Code, der durch die Anzahl dividiert oder ein Element liest, muss den leeren Fall selbst behandeln.

Wichtige Erkenntnisse

  • For-each ist nützlich, wenn der Rumpf nur die einzelnen Werte braucht.
  • Verwende einen Index, um gespeicherte Werte zu schreiben, Positionen zu verfolgen oder Nachbarn zu vergleichen.
  • Eine Zuweisung an eine for-each-Variable ersetzt kein Array- oder Listenelement.
  • Der Zugriff auf einen Nachbarn bei i + 1 benötigt i < size() - 1.
  • Bei leeren Collections wird eine normale Traversierung nullmal ausgeführt.

3.2 Berechne ein Ergebnis aus vielen Elementen

Ein Akkumulator hält ein Ergebnis fest, das über mehrere Schleifendurchläufe aufgebaut wird. Initialisiere ihn vor der Schleife, aktualisiere ihn darin und verwende ihn danach. Der Startwert hängt von der Aufgabe ab: Eine Summe oder ein Zähler beginnt bei 0, während ein Maximum ein tatsächliches Element als Startwert braucht.

Summen und Mittelwerte
int sum = 0;
for (int value : numbers) {
    sum += value;
}
if (!numbers.isEmpty()) {
    double average = (double) sum / numbers.size();
    System.out.println(average);
}

Für [4, 7, 8] ändert sich sum von 0 auf 4, dann auf 11 und dann auf 19. Beide Operanden in sum / numbers.size() wären Ganzzahlen, was 6 ergibt. Die explizite Typumwandlung von sum vor der Division ergibt ungefähr 6,33. Eine Umwandlung des bereits berechneten Quotienten würde lediglich die abgeschnittene 6 in 6,0 umwandeln.

Eine leere Collection hat keinen gewöhnlichen Mittelwert. Eine Ganzzahldivision durch null löst eine ArithmeticException aus; die Gleitkommadivision 0.0 / 0 ergibt NaN. Entscheide vor der Division, was der leere Fall für das Programm bedeutet, etwa die Anzeige „Keine Messwerte“. Für die Dezimalstrecken [5.0, 7.5, 10.0] km beträgt die double-Summe 22,5 km und der Mittelwert 7,5 km.

Zähle nur Treffer

Ein bedingter Zähler beginnt bei 0 und wird nur erhöht, wenn seine Prüfung erfolgreich ist. Für die Temperaturen {22, 27, 31, 24, 26} Grad Celsius ergibt if (t > 25) { count++; } den Wert 3. Setze die Initialisierung außerhalb der Schleife; das Zurücksetzen von count bei jedem Durchlauf würde vorherige Treffer verwerfen.

Finde einen Extremwert und seine Position

Beginne bei einem nicht leeren Array mit int max = values[0];. Ersetze max, wann immer ein besuchter Wert größer ist. Ein Start bei 0 schlägt bei {-5, -2, -9} fehl: Er meldet 0, obwohl kein Element diesen Wert hat. Der Start mit -5 ermöglicht es der Schleife, das korrekte Maximum -2 zu finden. Ein Minimum verwendet dasselbe Muster mit <.

Wenn die Position wichtig ist, merke dir den Index des besten Werts:

int best = 0;
for (int i = 1; i < numbers.size(); i++) {
    if (numbers.get(i) > numbers.get(best)) {
        best = i;
    }
}

Für [4, 7, 8] endet best bei 2 und numbers.get(best) ist 8. Die Schleife beginnt bei 1, weil Index 0 bereits der anfängliche Kandidat ist. Bei > ersetzt ein gleicher Wert den aktuellen Kandidaten nicht, sodass das erste Maximum erhalten bleibt. Bei >= ersetzt jeder Gleichstand den Kandidaten, sodass das letzte Maximum erhalten bleibt. Prüfe auf eine leere Collection, bevor du einen Kandidaten an Index 0 festlegst.

Sammle passende Werte

Beim Filtern dient eine leere Ergebnisliste als Akkumulator. Durchlaufe jedes Wort, füge es hinzu, wenn word.length() > 4 gilt, und gib das Ergebnis zurück. Für [sun, planet, moon, galaxy] ist das Ergebnis [planet, galaxy]. Das Lesen der Eingabe und Hinzufügen zu einer separaten Liste lässt die Eingabe unverändert.

Bei zwei Integer-Elementen vergleicht == die Objektidentität. Zwischengespeicherte kleine Werte können diesen Fehler verbergen; gleiche größere Werte können verschiedene Objekte sein. Vergleiche mit equals oder führe zuerst Unboxing in int-Variablen aus. Die numerischen Operatoren <, >, <= und >= führen Unboxing für Wrapperwerte aus, sodass der Code für den besten Index ihre Zahlen vergleicht.

Wichtige Erkenntnisse

  • Initialisiere einen Akkumulator vor der Schleife und aktualisiere ihn darin.
  • Wandle vor der Ganzzahldivision den Typ um, damit der Nachkommateil eines Mittelwerts erhalten bleibt.
  • Prüfe auf eine leere Collection, bevor du einen Mittelwert berechnest oder einen Extremwert auswählst.
  • Initialisiere ein Maximum oder Minimum mit einem tatsächlichen Element.
  • > erhält das erste Maximum; >= erhält das letzte.
  • Beim Filtern werden Treffer in einer neuen Liste gesammelt.
  • Prüfe bei zwei Integer-Objekten auf Wertgleichheit.

3.3 Suche bis zu einem Treffer oder bis zum Ende

Eine lineare Suche prüft Elemente der Reihe nach. Sie funktioniert bei Daten in beliebiger Reihenfolge. Eine erfolgreiche Suche nach dem ersten Treffer kann früh enden; eine erfolglose Suche muss das Ende erreichen, bevor feststeht, dass kein Element übereinstimmt.

Gib den Index des ersten Treffers zurück
static int indexOfName(ArrayList<String> names, String target) {
    for (int i = 0; i < names.size(); i++) {
        if (names.get(i).equals(target)) {
            return i;
        }
    }
    return -1;
}

Steht der erste passende Name an Index 2, prüft die Methode die Indizes 0, 1 und 2 und gibt dann sofort 2 zurück. Das return -1 steht nach der Schleife, weil erst ein vollständiger Durchlauf das Fehlen feststellt. Ein else { return -1; } innerhalb der Schleife würde beim ersten nicht passenden Element abbrechen und alle späteren Kandidaten ignorieren.

Die Kennzeichnung für einen fehlenden Wert -1 kann kein gültiger Index sein. Der Aufrufer muss sie prüfen, bevor er das Ergebnis liest:

int index = indexOfName(names, "Ahmed");
if (index != -1) {
    System.out.println(names.get(index));
}

Die Prüfung index > 0 würde einen gültigen Treffer an Index 0 übersehen. Die direkte Verwendung von -1 in get würde eine Ausnahme auslösen. Bei einer leeren Liste wird der Schleifenrumpf nie ausgeführt und die Methode gibt korrekt -1 zurück.

Passe den Vergleich an die Aufgabe an

Für exakte Listenwerte führen contains und indexOf bereits eine lineare Suche aus. Schreibe eine Schleife für ein Array oder eine Bedingung wie „beginnt mit L“. Verwende equals oder equalsIgnoreCase für Strings, == für primitive Werte und equals für zwei Integer-Objekte. Eine Identitätsprüfung bei Strings kann gleichen Text übersehen.

Prüfe für String[] cities = {"Oslo", "Lima", "Lagos", "Pune"} den Ausdruck cities[i].startsWith("L"). Index 0 erfüllt die Bedingung nicht; Index 1 erfüllt sie, daher ist das Ergebnis der Suche nach dem ersten Treffer 1. Wenn die Aufgabe alle Treffer verlangt, kehre dort nicht zurück. Hänge die Indizes der Treffer an eine Ergebnisliste an und durchlaufe den Rest; das ergibt [1, 2]. Um Treffer zu zählen, erhöhe einen Zähler, statt Positionen zu speichern.

Wähle die Form der Antwort

Eine Ja-Nein-Suche kann mit boolean found = false; beginnen. Setze den Wert bei einem Treffer auf true und verlasse die Schleife mit break. Ohne break bleibt die endgültige Antwort true, aber das Programm prüft Werte, die es nicht mehr braucht. Eine Suchmethode kann auch sofort true und nach der Schleife false zurückgeben.

Wenn ein Element zurückgegeben wird, braucht es ein separates Ergebnis für „nichts gefunden“. Bei einem String ist dies oft null; der Aufrufer muss darauf prüfen, bevor er eine String-Methode aufruft. Die Rückgabe eines Index mit -1 macht den Fall eines fehlenden Werts sichtbar, ohne einen leeren String als fehlende Daten auszugeben.

Zähle den tatsächlichen Aufwand der Suche

Ein gesuchter Wert an der ersten Position benötigt einen Vergleich. Ein gesuchter Wert an der dritten Position benötigt drei. Ein fehlender Wert unter 10.000 Namen benötigt alle 10.000 Vergleiche. Der erste fehlgeschlagene Vergleich kann nicht feststellen, dass der gesuchte Wert an den übrigen Positionen fehlt. Auch eine Suche nach allen Treffern prüft jedes Element, selbst nach einem frühen Treffer, weil spätere Werte ebenfalls passen können.

Wichtige Erkenntnisse

  • Die lineare Suche prüft Elemente der Reihe nach und funktioniert bei jeder Eingabereihenfolge.
  • Gib beim ersten Treffer einen Index zurück; gib -1 erst nach der Schleife zurück.
  • Verwende den zum Elementtyp passenden Vergleich.
  • Suchen nach allen Treffern prüfen auch nach einem Treffer weiter.
  • Prüfe auf die Kennzeichnung für einen fehlenden Wert, bevor du das Suchergebnis verwendest.

3.4 Entferne Elemente, ohne sie zu überspringen

Das Entfernen aus einer ArrayList ändert die Positionen, die eine Schleife durchlaufen soll. Das sichere Vorgehen hängt davon ab, ob du die ursprüngliche Liste ändern oder ein separates Ergebnis erstellen musst. Das Ersetzen von Werten ist einfacher, weil die Positionen dabei erhalten bleiben.

Sieh, wie eine vorwärts gerichtete Schleife einen Wert überspringt

Angenommen, eine Schleife entfernt gerade Zahlen aus [3, 8, 8, 5] und erhöht immer i. An Index 1 entfernt sie die erste 8. Die zweite 8 rückt an Index 1, aber der nächste Durchlauf verwendet Index 2. Das Ergebnis ist [3, 8, 5], eine gerade Zahl bleibt also stehen. Die Bedingung war richtig; das Vorrücken nach dem Entfernen war falsch.

Auch eine for-each-Schleife über eine ArrayList darf keine Elemente über die Liste hinzufügen oder entfernen. Sie verwendet einen Iterator, dessen Traversierungszustand nach einer Änderung nicht mehr zur Liste passt. Java meldet normalerweise eine ConcurrentModificationException. Manche Änderungen können stattdessen die Schleife unbemerkt beenden, sodass ein Element nicht besucht wird. Das Ausbleiben einer Ausnahme macht diese Änderung nicht sicher.

Entferne rückwärts, damit ungeprüfte Positionen stabil bleiben
for (int i = numbers.size() - 1; i >= 0; i--) {
    if (numbers.get(i) % 2 == 0) {
        numbers.remove(i);
    }
}

Bei [3, 8, 8, 5] enthält Index 3 den Wert 5 und bleibt erhalten. Index 2 enthält 8 und wird entfernt. Index 1 enthält weiterhin die andere 8 und wird als Nächstes entfernt. Index 0 enthält 3 und bleibt erhalten. Das Ergebnis ist [3, 5]. Das Entfernen verschiebt Elemente rechts vom aktuellen Index, die diese rückwärts gerichtete Schleife bereits geprüft hat.

Stelle die Werte zusammen, die erhalten bleiben sollen

Wenn das Original unverändert bleiben soll, erstelle eine neue Liste:

ArrayList<Integer> odds = new ArrayList<>();
for (int value : numbers) {
    if (value % 2 != 0) {
        odds.add(value);
    }
}

Diese for-each-Schleife ist sicher, weil sie numbers liest und Elemente zu einer anderen Liste hinzufügt. Mit [3, 8, 8, 5] als Eingabe enthält odds den Wert [3, 5] und die Eingabe weiterhin alle vier Werte. Auch ein Array kann nicht schrumpfen; zum Filtern seiner Werte brauchst du ebenfalls ein neues Array oder eine neue Liste.

Lass einen Iterator das Entfernen selbst verwalten
Iterator<Integer> it = numbers.iterator();
while (it.hasNext()) {
    if (it.next() % 2 == 0) {
        it.remove();
    }
}

Importiere java.util.Iterator. next() liefert das nächste Element, und it.remove() entfernt das gerade zurückgegebene Element und hält dabei die Position des Iterators konsistent. Ersetze es in dieser Schleife nicht durch numbers.remove(...).

Auch eine vorwärts gerichtete while-Schleife kann funktionieren, wenn sie nur weiterzählt, falls nichts entfernt wurde. Nach dem Entfernen muss sie denselben Index erneut prüfen, an den das nächste Element gerückt ist. Das erfordert mehr Sorgfalt als eine rückwärts gerichtete Schleife oder eine neue Ergebnisliste.

Ersetzen und Hinzufügen wirken unterschiedlich

set(i, value) ist in einer indexbasierten Schleife sicher, weil sich weder Größe noch Positionen ändern. Wenn du bei jedem Durchlauf ein Element hinzufügst und dabei i < list.size() prüfst, kann sich das Ende immer weiter verschieben und die Schleife endlos laufen. Speichere int originalSize = list.size(); und durchlaufe die Liste nur bis zu dieser Schleifengrenze, wenn jedes ursprüngliche Element einen angehängten Wert erzeugen soll.

Wichtige Erkenntnisse

  • Beim vorwärts gerichteten Entfernen mit anschließendem i++ wird das Element übersprungen, das an die entfernte Position gerückt ist.
  • Eine rückwärts gerichtete Schleife kann Elemente sicher nach Index entfernen.
  • Das Filtern in eine andere Liste erhält das Original.
  • Verwende beim Durchlaufen mit einem Iterator dessen eigene Methode remove.
  • Während einer for-each-Traversierung dürfen Elemente nicht über die Ausgangsliste hinzugefügt oder entfernt werden.
  • Begrenze Schleifen, die Werte anhängen, auf die ursprüngliche Größe, wenn nur ursprüngliche Elemente verarbeitet werden sollen.
4

Verarbeite Text mit String-Methoden

Text besteht aus Zeichen, aber ein Programm benötigt oft Namen, Zahlen oder ausgewählte Teile einer Zeile. Lies Positionen mit String-Methoden, finde ein Trennzeichen, bevor du Text ausschneidest, und wandle getrennte Datenfelder in Werte um, mit denen du rechnen kannst. Behalte die zurückgegebenen Ergebnisse im Blick: Strings sind unveränderlich, und das Bereinigen eines Strings hilft späterem Code nur, wenn dieser den bereinigten Text verwendet.

4.1 Lies Zeichen und speichere String-Ergebnisse

Ein String speichert Text als Folge von char-Werten. Die Indizes beginnen wie bei Arrays und Listen bei 0. Ein String-Objekt kann nach seiner Erstellung nicht verändert werden. Methoden, die geänderten Text erzeugen, geben daher ein Ergebnis zurück, das du speichern musst.

Ein Zeichen unterscheidet sich von einem String

"Hello".length() ist 5. "Hello".charAt(0) ist 'H' und charAt(4) ist 'o'. Ein char verwendet einfache Anführungszeichen und enthält eine UTF-16-Codeeinheit; ein String verwendet doppelte Anführungszeichen und kann null, eine oder viele solcher Einheiten enthalten. "Java".charAt(0) == 'J' vergleicht zwei primitive Zeichen. Der Vergleich dieses char mit "J" lässt sich nicht kompilieren, weil die Typen verschieden sind.

charAt(length()) liegt hinter dem Ende und löst eine StringIndexOutOfBoundsException aus. Selbst charAt(0) schlägt bei "" fehl. Prüfe isEmpty(), bevor du das erste Zeichen einer Eingabe liest.

length() zählt UTF-16-char-Werte, die nicht immer vollständige angezeigte Symbole sind. "café".length() ist 4; "Hi 👋".length() ist 5, weil das Emoji mit der winkenden Hand zwei char-Positionen belegt. Verwende diese Zählweise, wenn du die Indizes dieser Methoden nachvollziehst.

Durchlaufe und prüfe die Zeichen
String text = "Programming in Java".toLowerCase();
int vowels = 0;
for (int i = 0; i < text.length(); i++) {
    char c = text.charAt(i);
    if ("aeiou".indexOf(c) >= 0) {
        vowels++;
    }
}

Durch die Umwandlung in Kleinbuchstaben erkennt dieselbe Prüfung der Zugehörigkeit große und kleine Vokale. Jeder Aufruf von indexOf(c) ergibt einen nicht negativen Wert, wenn das Zeichen in "aeiou" vorkommt. Der Zähler erreicht 6: o, a, i, i, a, a. for (char c : text.toCharArray()) kann dieselben Werte ohne Index durchlaufen.

Die Klasse Character stellt Prüfungen wie isLetter, isDigit, isWhitespace und isUpperCase bereit. Character.isDigit('7') ist true, während Character.isLetter('7') false ist. Character.toUpperCase(c) und toLowerCase(c) geben umgewandelte char-Werte zurück.

Zeichen haben auch numerische Codes. 'a' + 1 ergibt den int 98; (char) ('a' + 1) wandelt diesen Code in 'b' um. Bei einem ASCII-Ziffernzeichen ergibt das Abziehen von '0' seinen Wert: '7' - '0' ist 7. Das Abziehen des Codes für null funktioniert, weil diese Zifferncodes aufeinanderfolgen.

Lies Konkatenationen von links nach rechts
AusdruckErgebnis
"Total: " + 3 + 4"Total: 34"
3 + 4 + " items""7 items"
"Total: " + (3 + 4)"Total: 7"

Sobald die linke Seite von + Text ist, wird die nächste Zahl als Text angefügt. Klammern erzwingen die numerische Addition vor dem Verknüpfen. Für wenige Verknüpfungen in einem Ausdruck ist + eine übersichtliche Lösung.

Speichere den zurückgegebenen Text
String name = "Lena";
name.toUpperCase();
System.out.println(name);
name = name.toUpperCase();

Die Ausgabe zeigt weiterhin "Lena": Der verworfene Aufruf hat das Objekt nicht verändert. Durch die anschließende Zuweisung verweist name auf "LENA". Die Unveränderlichkeit von Strings bedeutet, dass der alte Text unverändert bleibt, selbst wenn andere Variablen darauf verweisen. Das Speichern des Ergebnisses und das Ändern des ursprünglichen Objekts sind verschiedene Vorgänge.

Wichtige Erkenntnisse

  • charAt(i) gibt einen char zurück; gültige Indizes enden bei length() - 1.
  • Chars verwenden einfache Anführungszeichen; Strings verwenden doppelte Anführungszeichen.
  • Die String-Länge zählt UTF-16-char-Werte, daher belegen manche Symbole zwei Positionen.
  • Character-Methoden prüfen und wandeln einzelne char-Werte um.
  • Die Verknüpfung von Strings mit + erfolgt von links nach rechts.
  • Speichere das Ergebnis einer String-Umwandlung.

4.2 Finde und extrahiere Teile von Text

Die Textverarbeitung folgt oft einer kurzen Abfolge: Finde eine Markierung, prüfe, ob sie vorhanden ist, und extrahiere dann den benötigten Teil. Bereinigungsoperationen können den Text vor einer Suche oder einem Vergleich vorbereiten. Jede String-Operation gibt ein Ergebnis zurück, ohne ihr ursprüngliches Objekt zu ändern.

Finde Positionen oder stelle eine Ja-Nein-Frage

Für "banana" gibt indexOf('a') den Wert 1 zurück, indexOf("a", 2) den Wert 3 und lastIndexOf('a') den Wert 5. Das zweite Argument legt fest, wo die Vorwärtssuche beginnt. Eine erfolglose Suche ergibt -1, wie bei indexOf("x").

Verwende contains(text), wenn du nur wissen musst, ob Text vorkommt. startsWith(prefix) prüft den Anfang und endsWith(suffix) das Ende. "report.pdf".endsWith(".pdf") ist true. Diese Suchen beachten die Groß- und Kleinschreibung: "Hello".contains("hello") ist false. Die Indexmethoden akzeptieren einen char oder einen String; contains nimmt Text entgegen.

Ein Teilstring endet unmittelbar vor seinem Endindex
String word = "programming";
String middle = word.substring(3, 7);
String tail = word.substring(3);

middle ist "gram" und verwendet die Positionen 3, 4, 5 und 6. Seine Länge ist 7 - 3, also 4. tail ist "gramming", weil das Weglassen des Endarguments den Teilstring bis zum Ende des Strings reichen lässt. Der Anfang muss nicht negativ und darf nicht größer als das Ende sein; das Ende darf length() nicht überschreiten. Ungültige Schranken lösen eine StringIndexOutOfBoundsException aus.

Finde bei einer E-Mail-Adresse vor dem Ausschneiden das Trennzeichen:

String email = "lena.ito@example.com";
int at = email.indexOf("@");
if (at != -1) {
    String user = email.substring(0, at);
    String domain = email.substring(at + 1);
}

Das Trennzeichen steht an Index 8. Der erste Ausschnitt endet davor und ergibt "lena.ito"; der zweite beginnt danach und ergibt "example.com". Fehlt die Markierung, ist at gleich -1. Ein Aufruf von substring(0, at) ohne die Prüfung würde fehlschlagen. Würde der zweite Ausschnitt bei at beginnen, bliebe das @ in der Domain erhalten.

Bereinige nur das, worauf die Operation zielt
MethodeWirkung
toUpperCase() / toLowerCase()Gibt Text mit umgewandelter Groß- und Kleinschreibung zurück
trim()Entfernt führende und nachfolgende Zeichen mit Codes bis einschließlich U+0020
strip()Entfernt führenden und nachfolgenden Leerraum, den Character.isWhitespace erkennt
replace(target, replacement)Ersetzt jedes literale Vorkommen
repeat(n)Fügt n Kopien des Texts zusammen

" hello ".trim() ergibt "hello"; innere Leerzeichen bleiben erhalten. strip() behandelt zusätzlichen Unicode-Leerraum wie ein Geviert. Die Methode verwendet Javas Leerraumdefinition, die nicht jedes Zeichen einschließt, das wie ein Leerzeichen aussieht. "banana".replace('a', 'o') ergibt "bonono". "ab".repeat(3) ergibt "ababab".

Leer und nur aus Leerraum bestehend sind verschieden

isEmpty() prüft auf Länge 0. isBlank() akzeptiert auch Text, der nur aus Java-Leerraum besteht. Für " " ist die erste Prüfung false und die zweite true. Verwende die Prüfung, die zur Eingaberegel passt. Um eine Antwort wie " Yes " zu bereinigen, gibt answer.trim().toLowerCase() den Wert "yes" zurück. Speichere den zurückgegebenen Text, wenn die Variable den bereinigten Wert behalten soll; ein allein stehendes answer.trim(); verwirft ihn.

Wichtige Erkenntnisse

  • Positionssuchen geben -1 zurück, wenn eine Markierung fehlt.
  • substring(begin, end) schließt begin ein und end aus.
  • Prüfe eine gefundene Position, bevor du sie als Grenze für einen Ausschnitt verwendest.
  • replace ersetzt literalen Text; trim und strip wirken an den Enden.
  • isBlank akzeptiert Text, der nur aus Leerraum besteht, während isEmpty die Länge 0 verlangt.

4.3 Wandle eine Textzeile in nutzbare Datenfelder um

Eine Datenzeile kann mehrere Werte enthalten, die durch ein Komma oder eine andere Markierung getrennt sind. Das Aufteilen erzeugt ein Array von Strings; das anschließende Parsen wandelt ausgewählte Datenfelder in Zahlen um. Prüfe die Struktur der Daten, bevor du auf ihre Positionen zugreifst.

Teile in ein Array auf
String[] fields = "Ada,36,London".split(",");

Es gibt drei Datenfelder: "Ada", "36" und "London". Die Kommas bleiben nicht erhalten. fields.length ist 3 und fields[1] ist weiterhin Text, keine Zahl.

Das an split übergebene Trennzeichen ist ein regulärer Ausdruck, also ein Muster und nicht immer literaler Text. Ein Komma steht für sich selbst, aber ., |, *, + und ? haben besondere Bedeutungen. Um eine Versionszeichenfolge an tatsächlichen Punkten zu trennen, verwende "1.5.2".split("\\."). Zwei umgekehrte Schrägstriche im Java-String erzeugen den einen umgekehrten Schrägstrich im Muster, der den Punkt als tatsächliches Zeichen behandelt. split(".") trifft stattdessen auf einzelne Zeichen zu und erzeugt in diesem Beispiel ein leeres Array.

Behandle Leerzeichen und leere Teile

Das Aufteilen von "a b" an " " erzeugt drei Teile: "a", "" und "b". Jedes Trennzeichen ist ein Leerzeichen, sodass benachbarte Leerzeichen einen leeren Teil zwischen sich lassen. Verwende für Folgen von Leerraum:

String[] words = "  red   green blue ".trim().split("\\s+");

Das Ergebnis ist [red, green, blue]. Die vorherige Bereinigung mit trim verhindert einen leeren ersten Teil durch ein führendes Trennzeichen. Standardmäßig verwirft split leere Teile am Ende: "a,b,,".split(",") ergibt nur "a" und "b". Zähle die tatsächlich entstandenen Datenfelder, bevor du über Indizes darauf zugreifst.

Parse jedes Datenfeld in den vorgesehenen Typ

Integer.parseInt("42") gibt den primitiven int 42 zurück. Integer.valueOf("-7") gibt ein Integer-Objekt zurück. Double.parseDouble("5.2") gibt 5,2 zurück und verwendet unabhängig von den Ländereinstellungen des Computers einen Punkt als Dezimaltrennzeichen. Das Parsen von Ganzzahlen akzeptiert Ganzzahltext ohne Dezimalpunkt. Integer.parseInt("4.5") schlägt fehl, statt zu runden.

Bereinige Datenfelder vor dem Parsen mit trim, besonders bei Ganzzahltext: Integer.parseInt(" 42") löst eine NumberFormatException aus. Das Aufteilen an Kommas entfernt keine Leerzeichen um die Datenfelder. Auch eine korrekte Anzahl von Datenfeldern garantiert nicht, dass ein Feld eine gültige Zahl enthält.

Lies einen vollständigen Datensatz
String line = "Amira,10.5,63";
String[] parts = line.split(",");
if (parts.length == 3) {
    String name = parts[0].trim();
    double distanceKm = Double.parseDouble(parts[1].trim());
    int minutes = Integer.parseInt(parts[2].trim());
    double pace = minutes / distanceKm;
    System.out.println(name + ": " + pace + " min/km");
}

Die Strecke beträgt 10,5 km, die Zeit 63 Minuten und das Lauftempo 6,0 min/km. Die unvollständige Zeile "Amira,10.5" hat nur zwei Datenfelder; ohne die Prüfung der Anzahl würde parts[2] eine ArrayIndexOutOfBoundsException auslösen. Ein Programm kann diesen unvollständigen Datensatz überspringen oder melden, bevor es auf eine fehlende Position zugreift.

Wandle Text wieder um oder füge ihn zusammen

String.valueOf(42) und Integer.toString(42) ergeben beide "42". String.join(", ", List.of("Oslo", "Lima", "Pune")) ergibt "Oslo, Lima, Pune" und fügt Trennzeichen nur zwischen den Teilen ein. Die Methode akzeptiert eine Liste, ein Array oder einzelne String-Argumente. Das Zusammenfügen parst oder berechnet nichts: Es verbindet die übergebenen Strings.

Wichtige Erkenntnisse

  • split gibt ein String-Array zurück und behandelt sein Trennzeichen als Muster.
  • Maskiere einen tatsächlichen Punkt im Java-Code als "\.".
  • Verwende trim vor dem Aufteilen an Leerraumfolgen und vor dem Parsen von Ganzzahlfeldern.
  • Standardmäßig verwirft split leere Datenfelder am Ende.
  • Prüfe die Anzahl der Datenfelder und den Zahlentext, bevor du geparste Daten verwendest.
  • Verwende String.join für Textteile und Parsing-Methoden für Zahlen.
5

Vergleiche Strings korrekt und baue Text effizient auf

Gleich aussehender Text kann zu verschiedenen String-Objekten gehören. Wähle einen Vergleich, der zur Aufgabe passt: inhaltliche Gleichheit, Gleichheit ohne Beachtung der Groß- und Kleinschreibung oder Javas Zeichenordnung. Baue und bearbeite anschließend größere Texte mit StringBuilder. Wenn du Referenzen und Rückgabewerte verfolgst, kannst du vorhersagen, ob eine Operation vorhandenen Text ändert, ein Ergebnis erstellt oder nur zwei Objekte vergleicht.

5.1 Vergleiche String-Inhalte und ihre Reihenfolge

Zwei Variablen können Text mit denselben Zeichen enthalten, ohne auf dasselbe String-Objekt zu verweisen. Wähle den Vergleich passend zur Frage: gleicher Inhalt, gleicher Inhalt ohne Beachtung der Groß- und Kleinschreibung oder welcher Text in Javas Ordnung zuerst kommt.

Verwende equals für Inhalte
String answer = new String("yes");
System.out.println(answer == "yes");
System.out.println(answer.equals("yes"));

Das erste Ergebnis ist false: Das separat erstellte Objekt ist nicht das Objekt des Literals. Das zweite ist true, weil die Zeichen übereinstimmen. Identische Literale wie in "yes" == "yes" nutzen ein Objekt gemeinsam und können den Identitätsvergleich zuverlässig erscheinen lassen. Während der Laufzeit entstandener Text kann neue oder vorhandene Objekte verwenden, daher eignet sich die Identität nicht, um übereinstimmende Eingaben zu prüfen.

equalsIgnoreCase ignoriert die Groß- und Kleinschreibung: "YES".equalsIgnoreCase("yes") ist true. Die Methode entfernt keine Leerzeichen. Um auch umgebende Leerzeichen zu akzeptieren, bereinige die Eingabe vor dem Vergleich.

Bei einer Variable, die null sein könnte, rufe die Methode auf einem bekannten Literal auf, das nicht null ist: "yes".equals(answer) gibt für null den Wert false zurück. answer.equals("yes") löst eine NullPointerException aus, wenn answer null ist, weil kein Objekt den Aufruf empfängt.

Eine Befehlsschleife kann !command.equals("quit") prüfen. Das ! negiert die inhaltliche Gleichheit. command != "quit" prüft stattdessen Referenzen und kann eine Schleife am Laufen halten, selbst wenn die eingegebenen Zeichen „quit“ lauten.

Deute das Vorzeichen von compareTo

a.compareTo(b) vergleicht UTF-16-char-Werte der Reihe nach. Die Methode gibt eine negative Zahl zurück, wenn a vor b steht, null bei Gleichheit und eine positive Zahl, wenn es danach steht. Für die Ordnung zählt nur das Vorzeichen; ein Ergebnis muss nicht genau -1 oder 1 sein.

VergleichVorzeichenGrund
"apple".compareTo("banana")NegativDas erste unterschiedliche char steht früher
"pear".compareTo("pear")NullAlle Zeichen stimmen überein
"car".compareTo("carpet")NegativGleiches Präfix, kürzerer String zuerst
"10".compareTo("9")Negativ'1' steht vor '9'

Als Text gespeicherte Zahlen folgen daher nicht der numerischen Reihenfolge. Parse sie, wenn die Aufgabe numerisch ist. Akzentlose englische Großbuchstaben stehen vor akzentlosen Kleinbuchstaben, daher kommt "Zebra" vor "apple". "Émile" mit Akzent kommt in dieser Ordnung nach "Zoe". compareToIgnoreCase ignoriert die Groß- und Kleinschreibung; für eine sprachspezifische Wörterbuchordnung brauchst du java.text.Collator.

Verwende das Minimummuster erneut für Namen

Für eine nicht leere Liste [Mia, Ahmed, Lucia]:

String first = names.get(0);
for (String name : names) {
    if (name.compareTo(first) < 0) {
        first = name;
    }
}

"Mia" ist der erste Kandidat. "Ahmed" steht im Vergleich davor und wird zum Kandidaten; "Lucia" ersetzt ihn nicht. Das Ergebnis ist "Ahmed". Prüfe auf eine leere Liste, bevor du ihr erstes Element liest.

Ein einzelner char ist ein primitiver Wert, daher ist word.charAt(0) == 'A' ein korrekter Zeichenvergleich, sobald feststeht, dass das Wort nicht leer ist. Das Problem mit == betrifft die Objektidentität, nicht jeden Vergleich mit Text.

Wichtige Erkenntnisse

  • Verwende equals für String-Inhalte und equalsIgnoreCase, um die Groß- und Kleinschreibung zu ignorieren.
  • Ein bekanntes Literal kann equals sicher empfangen, wenn das Argument null sein könnte.
  • == prüft die String-Identität, auch wenn gemeinsam genutzte Literale den Fehler verbergen.
  • Beachte bei compareTo nur das Vorzeichen.
  • Javas String-Ordnung ist eine UTF-16-Ordnung, keine numerische oder sprachspezifische Wörterbuchordnung.

5.2 Baue Text mit StringBuilder auf und bearbeite ihn

Ein StringBuilder enthält veränderlichen Text. Er ist nützlich, wenn eine Schleife viele Teile hinzufügt oder wenn Zeichen direkt bearbeitet werden müssen. Wenige Verknüpfungen in einem Ausdruck sind mit + übersichtlich, aber das wiederholte Neuerstellen eines wachsenden Strings kann dessen angesammelten Inhalt oft kopieren.

Hänge Teile an und schließe mit einem String ab
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= 5; i++) {
    if (i > 1) {
        sb.append(", ");
    }
    sb.append(i);
}
String result = sb.toString();

Ein Import ist nicht nötig. append hängt Strings, chars, Zahlen oder boolesche Werte am Ende an. Der erste Durchlauf fügt nur 1 hinzu; der zweite fügt ", " und dann 2 hinzu. Das Ergebnis ist "1, 2, 3, 4, 5". Ein Trennzeichen nach jeder Zahl würde ein unerwünschtes Trennzeichen am Ende hinterlassen. Für eine vorhandene Liste von Strings behandelt String.join(", ", list) die Trennzeichen direkt.

Wiederholtes text += piece in einer Schleife erzeugt neue unveränderliche String-Ergebnisse. Das angesammelte Präfix muss jedes Mal übernommen werden, sodass die kopierte Datenmenge beim Wachsen eines langen Ergebnisses quadratisch wachsen kann. Ein Builder verwaltet einen veränderlichen Puffer und hängt daran an, ohne bei jedem Durchlauf das gesamte Präfix neu aufzubauen.

Bearbeite Positionen und Bereiche
MethodeWirkung
insert(i, x)Fügt an Position i ein
delete(start, end)Entfernt einen Bereich ohne end
deleteCharAt(i)Entfernt ein char
setCharAt(i, c)Ersetzt ein char
replace(start, end, text)Ersetzt einen Bereich ohne end
reverse()Kehrt die Reihenfolge des Builders um

length() und charAt(i) lesen den Builder wie einen String. Indizes beschreiben seinen aktuellen Zustand; ein Einfügen oder Löschen kann spätere Positionen ändern.

Beginne mit new StringBuilder("Jva"). insert(1, 'a') ergibt "Java"; setCharAt(0, 'j') ergibt anschließend "java". Bei "2026-10-22" entfernt delete(4, 7) die Positionen 4, 5 und 6 und hinterlässt "2026-22". Das Ersetzen der Positionen 7 bis 9 in "I like tea" durch "coffee" ergibt "I like coffee".

Verkette nur Methoden, die den Builder zurückgeben

new StringBuilder().append("a").append(1).append('b').toString() ergibt "a1b". Die append-Aufrufe geben denselben Builder zurück und ermöglichen so einen weiteren Aufruf. Auch die hier genannten Bearbeitungsmethoden geben den Builder zurück, außer setCharAt: Diese Methode gibt void zurück und benötigt eine separate Anweisung.

reverse() ändert das Empfängerobjekt. Enthält sb den Text "stressed", hinterlässt String r = sb.reverse().toString(); sowohl in r als auch im Text des Builders den Wert "desserts". Um den ursprünglichen Builder zu erhalten, kehre einen neuen Builder um, der aus seinem Text erstellt wurde.

Vergleiche fertige Inhalte

Hänge für eine Palindromprüfung die Kleinschreibung jedes Buchstabens aus "Was it a car or a cat I saw" an. Der bereinigte Text ist "wasitacaroracatisaw". Kehre einen neuen Builder mit diesem Text um, wandle ihn in einen String um und vergleiche mit clean.equals(reversed). Der Vergleich ist true.

StringBuilder überschreibt equals nicht für den Inhaltsvergleich. Separate Builder mit dem Inhalt "abc" sind nach dieser Methode nicht gleich, und ein Builder ist nicht gleich einem String. Wandle zuerst um: sb1.toString().equals(sb2.toString()) vergleicht den tatsächlichen Text.

Wichtige Erkenntnisse

  • Verwende append, um ein langes Ergebnis aufzubauen, und toString, um es fertigzustellen.
  • Setze Trennzeichen zwischen Werte und vermeide ein zusätzliches Trennzeichen am Ende.
  • Builder-Bearbeitungen ändern den vorhandenen Builder; Bereichsenden sind ausgeschlossen.
  • setCharAt gibt void zurück und kann daher nicht verkettet werden.
  • reverse ändert den Builder, auf dem du die Methode aufrufst.
  • Wandle Builder vor dem Inhaltsvergleich in Strings um.

Listen, Arrays und Strings in Java: Beispiele

5 Interaktive Lektionen

1

Erstelle eine Leseliste und nutze sie gemeinsam

13 Schritte
Erstelle eine Liste, verfolge Änderungen ihrer Positionen und entscheide, welche Änderungen für eine andere Variable sichtbar sind.
  1. 1
    EinführungVerfolge eine veränderliche Leseliste

    Eine Leseliste kann leer beginnen und wachsen, wenn Vorschläge eintreffen. Du wirst Titel hinzufügen, einen Eintrag korrigieren, ein Duplikat entfernen und die Liste an eine Methode übergeben. Halte beim Nachvollziehen des Codes zwei Fragen getrennt: Welches Element steht jetzt an welchem Index, und welche Variablen verweisen auf dasselbe Listenobjekt? Die erste Frage erklärt Positionsänderungen, die zweite gemeinsam sichtbare Änderungen.

  2. 2
    ErklärungErstelle die leere Collection

    Importiere java.util.ArrayList und erstelle dann die Liste:

    ArrayList<String> reading = new ArrayList<>();
    reading.add("Orbit");
    reading.add("River");
    

    Der Elementtyp ist String. Die leere Liste wächst auf die Größe 2 und enthält [Orbit, River]. Index 0 bezeichnet Orbit und Index 1 bezeichnet River. Durch die Diamant-Syntax <> kann Java den Elementtyp aus der linken Seite ableiten.

  3. 3
    BeispielFüge vor einem gespeicherten Titel ein

    Arbeite mit derselben Liste weiter:

    reading.add(1, "Cloud");
    String old = reading.set(2, "Forest");
    

    Das Einfügen verschiebt River von Index 1 an Index 2 und ergibt [Orbit, Cloud, River]. Das anschließende Ersetzen ändert den Wert an Index 2 zu Forest und gibt River in old zurück. Die fertige Liste ist [Orbit, Cloud, Forest]. Anders als das Einfügen hat das Ersetzen die Größe nicht verändert.

  4. 4
    HerausforderungFinde die nächste gültige Position

    Die Liste ist [Orbit, Cloud, Forest]. Was passiert, wenn du reading.add(3, "Dune") aufrufst? Was würde reading.get(3) danach zurückgeben?

    ---reveal---

    Das Einfügen hängt Dune an, weil der Index size() beim Einfügen erlaubt ist. Die Größe wird zu 4, daher ist Index 3 nun zum Lesen gültig und gibt "Dune" zurück. Das Lesen von Index 3 vor dem Einfügen wäre fehlgeschlagen.

  5. 5
    ErklärungEntferne einen Wert und verfolge die Verschiebung

    Füge ein weiteres Cloud hinzu und entferne dann nach Wert:

    reading.add("Cloud");
    boolean removed = reading.remove("Cloud");
    

    Die Liste vor dem Entfernen ist [Orbit, Cloud, Forest, Dune, Cloud]. Nur das erste Cloud wird entfernt, das Ergebnis ist also [Orbit, Forest, Dune, Cloud] und removed ist true. Forest und jedes spätere Element rücken eine Position nach links. Das letzte Cloud bleibt in der Liste.

  6. 6
    TippFrage, ob oder wo

    Für [Orbit, Forest, Dune, Cloud] ist contains("Orbit") gleich true und indexOf("Orbit") gleich 0. Eine Prüfung auf einen Treffer muss Index 0 akzeptieren: Verwende index != -1, nachdem du das Suchergebnis gespeichert hast. Ein fehlender Titel ergibt -1. Suchmethoden vergleichen String-Inhalte unter Beachtung der Groß- und Kleinschreibung, daher findet die Suche nach "orbit" den Wert "Orbit" nicht. Verwende lastIndexOf, wenn die letzte Position eines Treffers wichtig ist.

  7. 7
    HerausforderungEntferne eine Zahl nach ihrer Bedeutung

    Eine separate ArrayList<Integer> enthält [9, 1, 9]. Du möchtest den ersten Wert 9 entfernen. Welcher Aufruf funktioniert und was bleibt übrig?

    ---reveal---

    numbers.remove(Integer.valueOf(9)) wählt das Entfernen nach Wert und hinterlässt [1, 9]. remove(9) würde Index 9 auswählen, der ungültig ist. Der primitive int wählt einen Index, obwohl die Liste selbst Ganzzahlen speichert.

  8. 8
    AnalogieZwei Namen für ein Notizbuch

    Stell dir eine Referenz als eine Notiz vor, auf der steht, wo ein Notizbuch aufbewahrt wird. Eine Kopie der Notiz erstellt kein weiteres Notizbuch. Mit ArrayList<String> shared = reading; bezeichnen beide Variablen eine Liste, sodass shared.add("Coast") über reading sichtbar ist. Ein Kopierkonstruktor, new ArrayList<>(reading), erstellt dagegen eine andere Liste mit eigenen Speicherplätzen.

  9. 9
    BeispielKopiere vor dem Ändern

    Beginne mit [Orbit, Forest, Dune, Cloud]:

    ArrayList<String> copy = new ArrayList<>(reading);
    copy.remove("Dune");
    

    Die Kopie wird zu [Orbit, Forest, Cloud], während reading unverändert bleibt. Beide Listen verwiesen anfangs auf dieselben unveränderlichen String-Elemente, aber ihre Listenplätze sind getrennt. Das Entfernen eines Platzes aus einer Liste entfernt ihn nicht aus der anderen.

  10. 10
    KernaussageEin Parameter ist ein weiterer lokaler Name

    Eine Methode erhält eine Kopie einer Listenreferenz. Der Aufruf von titles.clear() über diesen Parameter ändert die gemeinsam genutzte Liste. Die Zuweisung titles = new ArrayList<>(); ändert nur den lokalen Namen, sodass der Aufrufer seine alte Liste behält. Eine leere Liste ist weiterhin ein Objekt; null ist kein Objekt. Der Aufruf von size() auf einer leeren Liste gibt 0 zurück, während der Aufruf über null fehlschlägt.

  11. 11
    HerausforderungUnterscheide gemeinsame Änderungen von lokaler Neuzuweisung

    Eine Liste des Aufrufers ist [North, South]. Die Methode führt diese Anweisungen aus:

    titles.remove("North");
    titles = new ArrayList<>();
    titles.add("East");
    

    Was sieht der Aufrufer weiterhin?

    ---reveal---

    Er sieht [South]. Das Entfernen ändert zuerst das gemeinsam genutzte Objekt. Die Neuzuweisung lässt anschließend nur den Methodenparameter auf eine andere Liste verweisen, sodass East zu dieser hinzugefügt wird. Die Referenz des Aufrufers wurde nie umgelenkt.

  12. 12
    HerausforderungKombiniere Kopieren, Suchen und Bearbeiten

    a enthalte [Lake, Hill]. Führe dann b = new ArrayList<>(a), b.add("Lake") und b.remove(b.indexOf("Lake")) aus. Was enthalten a und b, und gibt a.equals(b) true zurück?

    ---reveal---

    Die Suche gibt Index 0 zurück, sodass b zu [Hill, Lake] wird. Das Original a bleibt [Lake, Hill]. Die Größen stimmen überein, aber die Reihenfolge ist verschieden, daher gibt equals bei Listen false zurück.

  13. 13
    ZusammenfassungSage eine Listenänderung voraus

    Bestimme bei einer Bearbeitung zuerst ihr Ziel: eine Position für set oder das Entfernen nach Index, einen Wert für das Entfernen nach Wert und eine Einfügeposition für add. Aktualisiere dann verschobene Indizes, bevor du den nächsten Aufruf verfolgst. Um vorauszusagen, was eine andere Variable sieht, verfolge, ob sie die Liste gemeinsam nutzt oder eine separate Kopie enthält. Eine Neuzuweisung in der Methode betrifft ihren Parameter; Bearbeitungen betreffen das Objekt, auf das dieser Parameter gerade verweist.

2

Speichere und kopiere Messwerte mit fester Anzahl

10 Schritte
Verwende feste Array-Speicherplätze, untersuche Standardwerte und erhalte Daten beim Kopieren und Vertauschen.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungGib jedem Messwert einen festen Speicherplatz
  2. 2
    ErklärungLege die Speicherplätze an
  3. 3
    BeispielGib die benötigten Daten aus
  4. 4
    HerausforderungLies den letzten Speicherplatz
  5. 5
    BeispielVerfolge einen Alias
  6. 6
    BeispielErstelle eine größere Kopie
  7. 7
    HerausforderungWähle einen Inhaltsvergleich
  8. 8
    BeispielSpeichere vor dem Überschreiben
  9. 9
    HerausforderungErhalte alte Daten beim Vergrößern
  10. 10
    ZusammenfassungUnterscheide Änderungen an Speicherplätzen von neuem Speicher
3

Wandle Messwerte in Ergebnisse um

17 Schritte
Verfolge den Schleifenzustand, berechne einen Mittelwert, suche nach einer Bedingung und entferne unerwünschte Werte sicher.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungGib jeder Schleife eine klare Aufgabe
  2. 2
    ErklärungLies Werte oder Positionen
  3. 3
    HerausforderungLass Platz für einen Nachbarn
  4. 4
    BeispielFühre eine Summe durch die Schleife
  5. 5
    BeispielDividiere und erhalte den Nachkommateil
  6. 6
    KernaussageEin Extremwert braucht einen tatsächlichen Kandidaten
  7. 7
    HerausforderungVerfolge das letzte von gleichen Maxima
  8. 8
    ErklärungHalte erst an, wenn die Antwort feststeht
  9. 9
    BeispielFinde den ersten Messwert über einem Schwellenwert
  10. 10
    HerausforderungWechsle vom ersten Treffer zu allen Treffern
  11. 11
    BeispielBeobachte das Überspringen beim Löschen nach vorn
  12. 12
    ErklärungDurchlaufe zum Entfernen rückwärts
  13. 13
    VerbindungErhalte die Ausgangsdaten durch Filtern
  14. 14
    TippVerwende den Iterator, der die Traversierung steuert
  15. 15
    HerausforderungBegrenze eine Schleife, die Elemente anhängt
  16. 16
    HerausforderungBerechne den Mittelwert nur für ausgewählte Werte
  17. 17
    ZusammenfassungVerfolge Zustand und Abbruchregeln
4

Lies einen Textdatensatz schrittweise ein

14 Schritte
Untersuche Zeichen, extrahiere einen bezeichneten Teil und teile einen Datensatz in numerische Datenfelder auf.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVon rohem Text zu Daten
  2. 2
    ErklärungLies jeweils ein Zeichen
  3. 3
    BeispielZähle Ziffern in einer Bezeichnung
  4. 4
    HerausforderungSpeichere eine Umwandlung
  5. 5
    ErklärungFinde zuerst eine Grenze
  6. 6
    BeispielZähle die eingeschlossenen Positionen
  7. 7
    TippWähle die Bereinigungsregel
  8. 8
    HerausforderungBehandle ein fehlendes Trennzeichen
  9. 9
    ErklärungTeile den Datensatz in Datenfelder auf
  10. 10
    BeispielWandle um und berechne
  11. 11
    KernaussageTrennzeichen können Muster beschreiben
  12. 12
    HerausforderungParse nach der Strukturprüfung
  13. 13
    HerausforderungNormalisiere Wörter und füge sie zusammen
  14. 14
    ZusammenfassungPrüfe bei jedem Schritt den Ergebnistyp
5

Vergleiche Befehle und erstelle einen Bericht

12 Schritte
Wähle Inhaltsvergleiche, deute die Textordnung und erstelle ein bearbeitbares Ergebnis, ohne das Original zu verlieren.

Speichere diese Einheit, um jede Interaktive Lektion Schritt für Schritt durchzugehen.

  1. 1
    EinführungVergleiche Bedeutungen und erstelle ein Ergebnis
  2. 2
    ErklärungWähle eine Inhaltsprüfung
  3. 3
    BeispielIgnoriere die Groß- und Kleinschreibung, ohne Leerzeichen zu ignorieren
  4. 4
    HerausforderungErkläre einen Test mit Literalen
  5. 5
    ErklärungOrdne nach dem ersten unterschiedlichen char
  6. 6
    HerausforderungBehalte den zuerst stehenden Textkandidaten
  7. 7
    ErklärungHänge an eine veränderliche Folge an
  8. 8
    BeispielSetze Trennzeichen zwischen Teile
  9. 9
    BeispielBearbeite die aktuellen Positionen
  10. 10
    HerausforderungErhalte die ursprüngliche Reihenfolge
  11. 11
    HerausforderungErstelle einen gefilterten Bericht
  12. 12
    ZusammenfassungVerwende die zur Frage passende Operation

Listen, Arrays und Strings in Java: Übungsaufgaben

40 Übungsfragen in 4 Sets

Set 1: Erstelle, bearbeite und teile Collections10 Übungsfragen

Frage 1 von 10

Welche Deklaration erstellt eine leere, veränderbare Liste von Ganzzahlwerten? Gehe davon aus, dass ArrayList und List importiert sind.
  1. ArrayList<int> n = new ArrayList<>();
  2. Integer[] n = new Integer[0];
  3. ArrayList<Integer> n = new ArrayList<>();
  4. List<Integer> n = List.of();
Antwort zeigenAntwort ausblenden
Antwort: C
Der Wrappertyp Integer ist der Elementtyp für eine Liste von Ganzzahlwerten. ArrayList<int> lässt sich nicht kompilieren, weil ein primitiver Datentyp kein generisches Typargument sein kann. Ein Array der Länge null und eine nicht modifizierbare List.of() können ebenfalls nicht die gesuchte wachsende Liste bereitstellen.

Frage 2 von 10

Was wird ausgegeben?

ArrayList<String> tools = new ArrayList<>(List.of("pen", "ruler"));
tools.add(1, "tape");
String old = tools.set(2, "clip");
System.out.println(old + ": " + tools);
  1. ruler: [pen, tape, clip]
  2. tape: [pen, clip, ruler]
  3. ruler: [pen, clip, tape]
  4. clip: [pen, tape, clip]
Antwort zeigenAntwort ausblenden
Antwort: A
Das Einfügen an Index 1 verschiebt "ruler" an Index 2, sodass set(2, "clip") diesen Wert ersetzt und "ruler" zurückgibt. Die fertige Liste ist [pen, tape, clip]. Die Rückgabe von "clip" würde den neuen Wert mit dem alten Wert verwechseln, den set zurückgibt.

Frage 3 von 10

Eine ArrayList<Integer> enthält [12, 24, 36]. Welcher Aufruf entfernt den Wert 24?
  1. values.remove(24);
  2. values.remove(Integer.valueOf(1));
  3. values.set(1, 24);
  4. values.remove(Integer.valueOf(24));
Antwort zeigenAntwort ausblenden
Antwort: D
Das Verpacken von 24 mit Integer.valueOf wählt das Entfernen nach Wert, sodass die Liste zu [12, 36] wird. Die Übergabe des primitiven int 24 wählt dagegen das Entfernen nach Index und schlägt fehl, weil Index 24 nicht existiert. Das Ersetzen des Elements an Index 1 durch 24 würde die Liste unverändert lassen.

Frage 4 von 10

Eine Namensliste enthält [Nora, Ravi, Nora, Mei]. Was ergeben nach names.remove("Nora") die Aufrufe names.indexOf("Nora") und names.lastIndexOf("Mei") in dieser Reihenfolge?
  1. 0 and 3
  2. 1 and 2
  3. -1 and 2
  4. 2 and 3
Antwort zeigenAntwort ausblenden
Antwort: B
Das Entfernen nach Wert löscht nur das erste "Nora" und hinterlässt [Ravi, Nora, Mei]. Die verbliebene Nora steht an Index 1 und Mei ist an Index 2 gerückt. Ein Ergebnis von -1 für Nora würde voraussetzen, dass ein Entfernen alle gleichen Werte löscht.

Frage 5 von 10

Was enthalten a und c nach diesem Code?

ArrayList<String> a = new ArrayList<>(List.of("oak"));
ArrayList<String> b = a;
ArrayList<String> c = new ArrayList<>(a);
b.add("elm");
c.set(0, "ash");
  1. a: [oak]; c: [ash]
  2. a: [oak, elm]; c: [ash]
  3. a: [ash, elm]; c: [ash, elm]
  4. a: [oak, elm]; c: [ash, elm]
Antwort zeigenAntwort ausblenden
Antwort: B
Durch die Zuweisung an b wird die Referenz von a gemeinsam genutzt, sodass das Hinzufügen über b ihre eine Liste ändert. Der Kopierkonstruktor erstellt c vor diesem Hinzufügen, sodass die Kopie einen unabhängigen Platz enthält. Elm in c zu erwarten, würde eine Kopie wie eine laufend aktualisierte Verbindung zu späteren Ergänzungen behandeln.

Frage 6 von 10

Was gibt Arrays.toString(new boolean[3]) zurück?
  1. "[null, null, null]"
  2. "[0, 0, 0]"
  3. "[]"
  4. "[false, false, false]"
Antwort zeigenAntwort ausblenden
Antwort: D
Ein neues boolean-Array hat drei Speicherplätze, die jeweils mit false initialisiert werden, und Arrays.toString gibt sie alle aus. Null ist der Standardwert für Speicherplätze mit Objektreferenzen, nicht für primitive boolean-Werte. Die Speicherplätze existieren bereits, obwohl keine Werte ausdrücklich zugewiesen wurden.

Frage 7 von 10

Ein double[] readings hat die Länge 6. Welcher Ausdruck liest seinen letzten Speicherplatz?
  1. readings[5]
  2. readings[6]
  3. readings.get(5)
  4. readings[readings.length()]
Antwort zeigenAntwort ausblenden
Antwort: A
Sechs Array-Speicherplätze haben die Indizes 0 bis 5, daher ist der letzte Speicherplatz readings[5]. Index 6 liegt eine Position hinter dem Ende und löst eine Ausnahme aus. Der Array-Zugriff verwendet eckige Klammern, und length ist ein Feld ohne Klammern.

Frage 8 von 10

Was enthalten a und b nach diesem Code?

int[] a = {7, 3};
int[] b = Arrays.copyOf(a, 3);
b[0] = 8;
  1. a: [8, 3]; b: [8, 3, 0]
  2. a: [7, 3]; b: [8, 3]
  3. a: [7, 3]; b: [8, 3, 0]
  4. a: [7, 3, 0]; b: [8, 3, 0]
Antwort zeigenAntwort ausblenden
Antwort: C
Die Kopie ist ein neues Array mit drei Speicherplätzen, wobei der zusätzliche int-Speicherplatz mit 0 initialisiert wird. Das Ändern ihres ersten Speicherplatzes lässt das ursprüngliche Array mit zwei Speicherplätzen unverändert. Eine 8 in a würde das Kopieren mit der gemeinsam genutzten Referenz verwechseln, die durch b = a entsteht.

Frage 9 von 10

Zwei getrennt erstellte Arrays enthalten jeweils {6, 2}. Was ergeben a.equals(b) und Arrays.equals(a, b) in dieser Reihenfolge?
  1. false, true
  2. true, true
  3. true, false
  4. false, false
Antwort zeigenAntwort ausblenden
Antwort: A
equals erbt bei Arrays den Identitätsvergleich, daher sind die getrennt erstellten Arrays bei diesem Aufruf nicht gleich. Arrays.equals vergleicht entsprechende Werte und gibt true zurück. Bei beiden Aufrufen true zu erwarten, würde den Inhaltsvergleich von ArrayList auf ein Array übertragen.

Frage 10 von 10

Was enthält die Liste des Aufrufers nach edit(a)?

static void edit(ArrayList<Integer> x) {
    x.set(0, x.get(0) + 2);
    x = new ArrayList<>(x);
    x.add(9);
}
// In main:
ArrayList<Integer> a = new ArrayList<>(List.of(5, 8));
edit(a);
  1. [5, 8]
  2. [7, 8, 9]
  3. [7, 8]
  4. [5, 8, 9]
Antwort zeigenAntwort ausblenden
Antwort: C
Das erste set bearbeitet die gemeinsam genutzte Liste des Aufrufers und ändert 5 zu 7. Der Parameter wird dann auf eine separate Kopie umgelenkt, und nur diese Kopie erhält 9. Der Aufrufer behält [7, 8]; eine 9 im Ergebnis würde fälschlich voraussetzen, dass die Neuzuweisung des Parameters auch die Variable des Aufrufers umlenkt.
Set 2: Verfolge Schleifen und verarbeite Text10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was enthält das Array {2, 6, 9} nach for (int n : values) { n += 3; }?
  1. [5, 9, 12]
  2. [3, 3, 3]
  3. [9, 9, 9]
  4. [2, 6, 9]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Eine Ganzzahlliste enthält [5, 8, 9]. Welchen Wert ergibt (double) (total / values.size()), nachdem ihre Summe in einem int total berechnet wurde?
  1. 7.333333333333333
  2. 7.0
  3. 22.0
  4. 3.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Welches Paar gibt dieser Code für die nicht leere Liste [-8, -3, -3, -6] aus?

int best = 0;
int total = 0;
for (int i = 0; i < values.size(); i++) {
    int n = values.get(i);
    total += n;
    if (n >= values.get(best)) {
        best = i;
    }
}
System.out.println(best + ": " + (double) total / values.size());
  1. 2: -5.0
  2. 1: -5.0
  3. 2: -3.0
  4. 0: -5.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Die Methode wird mit {"Birch", "Cedar", "Maple"} und dem Suchwert „Maple“ aufgerufen. Was gibt sie zurück?

static int find(String[] a, String target) {
    for (int i = 0; i < a.length; i++) {
        if (a[i].equals(target)) return i;
        else return -1;
    }
    return -1;
}
  1. 0
  2. 2
  3. -1
  4. 3
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Welche Liste bleibt nach dieser Schleife übrig?

ArrayList<Integer> a = new ArrayList<>(List.of(4, 4, 7, 2));
for (int i = 0; i < a.size(); i++) {
    if (a.get(i) % 2 == 0) a.remove(i);
}
  1. [7]
  2. [4, 7]
  3. [4, 7, 2]
  4. [4, 4, 7]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was ergibt "Count: " + 2 + 6?
  1. "Count: 26"
  2. "Count: 8"
  3. "8Count: "
  4. "Count: 2 6"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was ergibt für String code = "AB:472:Q"; der Ausdruck code.substring(code.indexOf(":") + 1, code.lastIndexOf(":"))?
  1. ":472"
  2. "472:"
  3. "47"
  4. "472"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Welchen Typ gibt "Mina;18;Oslo".split(";") zurück?
  1. ArrayList<String>
  2. String
  3. String[]
  4. int[]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Wie viele Datenfelder erzeugt dieser Ausdruck?

"x,y,,".split(",")
  1. 3
  2. 4
  3. 2
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was wird ausgegeben?

String[] p = "  Omar, 12, 5  ".trim().split(",");
int distanceKm = Integer.parseInt(p[1].trim());
int hours = Integer.parseInt(p[2].trim());
double speed = distanceKm / hours;
System.out.println(speed);
  1. 2.4
  2. 12.5
  3. NumberFormatException
  4. 2.0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 3: Vergleiche Werte und erkenne Fehler10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Welcher Ausdruck prüft sicher, ob ein möglicherweise null enthaltender String namens reply genau „ready“ enthält?
  1. reply.equals("ready")
  2. "ready".equals(reply)
  3. reply == "ready"
  4. reply.compareTo("ready") == 0
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Ein Builder enthält „note“. Welchen Text enthält er nach sb.append(3)?
  1. "note"
  2. "3note"
  3. "note 3"
  4. "note3"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Zu welchem Wert wird "18".compareTo("4") < 0 ausgewertet und warum?
  1. true; the first character decides the order
  2. false; eighteen is greater than four
  3. true; two-character strings always come first
  4. false; the longer string always comes later
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Welcher Text ist in result gespeichert?

StringBuilder sb = new StringBuilder("plane");
sb.delete(1, 3);
sb.insert(1, "i");
String result = sb.toString();
  1. "pie"
  2. "pilane"
  3. "pine"
  4. "pline"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was gibt dieser Code aus?

String label = "lamp";
String other = label;
label = label.toUpperCase();
System.out.println(other + ":" + label);
  1. Beide Variablen behalten ihren ursprünglichen kleingeschriebenen Text.
  2. Beide Variablen verweisen auf das großgeschriebene Ergebnis.
  3. Das Original wird großgeschrieben; das neue Ergebnis bleibt klein.
  4. Das Original bleibt kleingeschrieben; die neu zugewiesene Variable ist großgeschrieben.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Was wird ausgegeben?

String[] a = {"ax", "beta", "brim", "sun"};
int first = -1;
int matches = 0;
for (int i = 0; i < a.length; i++) {
    if (a[i].startsWith("b")) {
        if (first == -1) first = i;
        matches++;
    }
}
System.out.println(first + ":" + matches);
  1. 1:2
  2. 2:2
  3. 1:1
  4. -1:2
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Welche Liste bleibt nach diesem Code übrig?

ArrayList<Integer> a = new ArrayList<>(List.of(2, 5, 2));
for (int i = a.size() - 1; i >= 0; i--) {
    if (a.get(i) == 2) a.remove(i);
}
int n = a.size();
for (int i = 0; i < n; i++) {
    a.add(a.get(i) * 2);
}
  1. [5, 2, 10, 4]
  2. [5]
  3. [5, 10]
  4. [2, 5, 2, 4, 10, 4]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Was sind a und b nach der Ausführung des Codes?

int[] a = {11, 4, 8};
int[] b = a;
int temp = b[0];
b[0] = b[2];
b[2] = temp;
b = Arrays.copyOf(b, 4);
b[1] = 0;
  1. a: [11, 4, 8]; b: [8, 0, 11, 0]
  2. a: [8, 4, 11]; b: [8, 0, 11, 0]
  3. a: [8, 0, 11]; b: [8, 0, 11, 0]
  4. a: [8, 4, 8]; b: [8, 0, 8, 0]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Eine Liste ist leer. Ein Programm prüft names.indexOf("Iris") >= 0, bevor es get mit diesem Ergebnis aufruft. Was passiert?
  1. Die Prüfung ist falsch, daher wird get übersprungen.
  2. Die Prüfung ist wahr und get gibt null zurück.
  3. indexOf löst eine Ausnahme aus, weil die Liste leer ist.
  4. Die Prüfung ist wahr und get löst eine Ausnahme aus.
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was wird ausgegeben?

StringBuilder a = new StringBuilder("drawer");
StringBuilder b = a;
String result = b.reverse().toString();
b = new StringBuilder("x");
System.out.println(a + ":" + result);
  1. drawer:reward
  2. x:reward
  3. reward:reward
  4. reward:drawer
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Set 4: Kombiniere Collection- und Textoperationen10 Übungsfragen

Speichere diese Einheit, um jede Antwort zu sehen und jedes Set zu üben.

Frage 1 von 10

Was ergeben " ".isEmpty() und " ".isBlank() in dieser Reihenfolge?
  1. true, true
  2. false, false
  3. false, true
  4. true, false
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 2 von 10

Welche Teile entstehen aus diesem Ausdruck?

"  north   east west ".trim().split("\\s+")
  1. [north, east, west]
  2. [, north, east, west]
  3. [north, , , east, west]
  4. [north east west]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 3 von 10

Eine nicht leere Namensliste enthält ["zen", "Able", "apple"]. Eine Schleife behält den ersten Kandidaten und ersetzt ihn, wenn name.compareTo(first) < 0 gilt. Welcher Name bleibt?
  1. apple, weil der Vergleich die Groß- und Kleinschreibung ignoriert
  2. Able, weil sein erster char vor den Kleinbuchstaben steht
  3. zen, weil spätere Kandidaten nie davor eingeordnet werden
  4. Kein Kandidat, weil Vergleiche mit gemischter Schreibung Ausnahmen auslösen
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 4 von 10

Eine ArrayList<String> hat die Größe 4. Was passiert, wenn auf add(4, "new") der Aufruf get(4) folgt?
  1. The insertion throws; get is never reached.
  2. The insertion succeeds; get throws afterward.
  3. The insertion replaces the old final element.
  4. The insertion succeeds; get returns "new".
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 5 von 10

Was sind die endgültige Liste out und der Mittelwert?

int[] a = {-2, 6, 10, 0};
ArrayList<Integer> out = new ArrayList<>();
int sum = 0;
for (int n : a) {
    if (n > 0) {
        out.add(n);
        sum += n;
    }
}
double average = (double) sum / out.size();
  1. [6, 10] and 4.0
  2. [6, 10] and 8.0
  3. [-2, 6, 10, 0] and 3.5
  4. [6, 10, 0] and 5.333333333333333
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 6 von 10

Welcher Index wird für die gezeigte Eingabe zurückgegeben?

static int firstLong(String[] words, int min) {
    for (int i = 0; i < words.length; i++) {
        String clean = words[i].trim();
        if (clean.length() >= min) return i;
    }
    return -1;
}
// Call:
firstLong(new String[] {"  ox  ", "pine", " map ", "cedar"}, 4)
  1. 0
  2. 3
  3. -1
  4. 1
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 7 von 10

Was sind a und kept nach diesem Code?

ArrayList<Integer> a = new ArrayList<>(List.of(2, -1, -1, 5));
ArrayList<Integer> kept = new ArrayList<>(a);
for (int i = kept.size() - 1; i >= 0; i--) {
    if (kept.get(i) < 0) kept.remove(i);
}
a.set(0, 9);
  1. a: [9, -1, -1, 5]; kept: [2, 5]
  2. a: [9, 5]; kept: [9, 5]
  3. a: [9, -1, -1, 5]; kept: [9, 5]
  4. a: [9, -1, -1, 5]; kept: [2, -1, 5]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 8 von 10

Die Methode soll den Text nach dem ersten „#“ oder „missing“ zurückgeben, wenn keine Markierung vorhanden ist. Welche Ersetzung lässt die Methode für beide Eingaben „tag#blue“ und „plain“ funktionieren?

static String tail(String s) {
    int p = s.indexOf("#");
    MISSING
}
  1. if (p == 0) return "missing"; return s.substring(p + 1);
  2. if (p == -1) return "missing"; return s.substring(p);
  3. if (p == -1) return "missing"; return s.substring(p + 1);
  4. if (p > 0) return "missing"; return s.substring(p + 1);
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 9 von 10

Welchen String gibt die Methode für das Array {"A", "B", "C"} zurück?

static String report(String[] parts) {
    StringBuilder sb = new StringBuilder();
    for (int i = parts.length - 1; i >= 0; i--) {
        if (sb.length() > 0) sb.append("/");
        sb.append(parts[i]);
    }
    sb.deleteCharAt(2);
    return sb.toString();
}
  1. "C/B/A"
  2. "C/BA"
  3. "A//C"
  4. "C//A"
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Frage 10 von 10

Was sind a und b nach change(a)?

static void change(ArrayList<String> x) {
    x.remove("red");
    x = new ArrayList<>();
    x.add("gold");
}
// In main:
ArrayList<String> a = new ArrayList<>(List.of("red", "blue", "red"));
ArrayList<String> b = a;
change(a);
  1. a: [gold]; b: [blue, red]
  2. a: [blue, red]; b: [blue, red]
  3. a: [blue]; b: [blue]
  4. a: [red, blue, red]; b: [red, blue, red]
Antwort zeigenAntwort ausblenden

Speichere diese Einheit, um diese Antwort zu sehen.

Hängst du bei deiner eigenen Aufgabe fest? Hausaufgabenhilfe

Schlüsselbegriffe

66 Schlüsselbegriffe, jeweils mit Definition

A

Akkumulator
Ein Akkumulator speichert ein über Schleifendurchläufe aufgebautes Ergebnis. Er beginnt vor der Schleife und ändert sich, während relevante Elemente verarbeitet werden.
Ein Summenakkumulator beginnt bei 0 und addiert jede Strecke, damit das Programm die Gesamtkilometerzahl ausgeben kann.
Alias
Ein Alias ist eine weitere Variable oder ein weiterer Name, der auf dasselbe Objekt verweist, sodass Änderungen über einen Namen über den anderen sichtbar sind.
Nach b = a ist b ein Alias von a; b.clear() leert die Liste, die über beide Variablen gelesen wird.
Anhängen
Eine Operation zum Anhängen fügt die Textdarstellung eines Werts am Ende eines StringBuilder hinzu und gibt denselben Builder für weitere Aufrufe zurück.
Das Anhängen von 4 nach „Page “ ändert den Builder ohne separate Neuzuweisung zu „Page 4“.
Array
Ein Array ist ein Objekt mit einer festen Anzahl gleichartiger Speicherplätze, auf die über bei null beginnende Indizes in eckigen Klammern zugegriffen wird.
Ein Array aus sieben double-Werten kann für jeden Tag einer Woche eine Temperatur in Grad Celsius speichern.
Array-Initialisierer
Ein Array-Initialisierer stellt beim Erstellen eines Arrays Elementwerte bereit, wobei die Anzahl der Werte die Länge des Arrays bestimmt.
Der Array-Initialisierer in int[] a = {3, 6, 9}; erstellt drei Speicherplätze mit diesen Werten.
Array-Kopie
Eine Array-Kopie ist ein separates Array, das aus einem vorhandenen Array befüllt wird und gegebenenfalls eine andere Länge sowie zusätzliche, mit Standardwerten gefüllte Speicherplätze hat.
Eine mit Arrays.copyOf(a, 5) erstellte Array-Kopie kann den Speicher vergrößern, ohne die Länge von a zu ändern.
ArrayIndexOutOfBoundsException
Eine ArrayIndexOutOfBoundsException meldet den Versuch, eine Array-Position außerhalb ihres gültigen Indexbereichs zu lesen oder zu beschreiben.
Eine ArrayIndexOutOfBoundsException tritt auf, wenn Code Index 4 eines Arrays mit vier Elementen liest.
ArrayList
Eine ArrayList ist eine geordnete, veränderbare Liste, deren Elementanzahl wächst oder schrumpft, wenn Werte hinzugefügt oder entfernt werden.
Eine ArrayList kann Namen sammeln, während Personen sie eingeben, ohne dass die endgültige Anzahl im Voraus bekannt sein muss.
Aufteilen
Eine Operation zum Aufteilen zerlegt Text an Treffern eines Trennmusters und gibt ein Array von Textteilen ohne die Trennzeichen selbst zurück.
Das Aufteilen an Kommas wandelt „Nia,25,Lima“ in drei Strings um, darunter den noch nicht geparsten Zahlentext.
Autoboxing
Autoboxing ist Javas automatische Umwandlung eines primitiven Werts in ein Objekt seiner zugehörigen Wrapperklasse.
Autoboxing ermöglicht numbers.add(8), obwohl der Elementtyp der Liste Integer und nicht int ist.

B

Bedingtes Zählen
Bedingtes Zählen erfasst, wie viele Elemente eine Prüfung bestehen, indem ein Zähler nur bei erfolgreicher Prüfung um eins erhöht wird.
Bedingtes Zählen kann erfassen, wie viele Tagestemperaturen 30 Grad Celsius überschreiten.

C

char
Ein char ist ein primitiver Java-Wert, der eine UTF-16-Codeeinheit speichert und als Zeichenliteral in einfachen Anführungszeichen geschrieben wird.
Der von "book".charAt(0) zurückgegebene char ist 'b', während "b" ein String der Länge 1 ist.
compareTo
Die Methode compareTo gibt je nach Ordnung des Empfängerobjekts im Verhältnis zu seinem Argument einen negativen Wert, null oder einen positiven Wert zurück.
String compareTo verwendet UTF-16-char-Werte, sodass ein Ergebnis unter null bedeutet, dass das Empfängerobjekt zuerst kommt.
ConcurrentModificationException
Eine ConcurrentModificationException kann melden, dass sich eine Collection auf eine Weise geändert hat, für die ihr aktiver Iterator nicht ausgelegt war.
Eine ConcurrentModificationException kann in einem einzelnen Thread auftreten, wenn ein for-each-Rumpf aus seiner Ausgangsliste entfernt.

D

Datenfeld
Ein Datenfeld ist ein Datenteil in einem Datensatz, der oft durch ein Trennzeichen wie ein Komma oder Semikolon von benachbarten Teilen getrennt ist.
Das zweite Datenfeld von „Ari,18,4“ muss geparst werden, wenn ein Programm seinen Zahlenwert für eine Berechnung benötigt.

E

Entfernen nach Index
Entfernen nach Index löscht das Element an einer angegebenen Position, gibt dieses Element zurück und verschiebt jedes spätere Element nach links.
Das Entfernen nach Index ändert [a, b, c] zu [a, c], wenn remove(1) das mittlere Element löscht.
Entfernen nach Wert
Entfernen nach Wert löscht das erste gleiche Element und gibt zurück, ob tatsächlich ein passendes Element entfernt wurde.
Das Entfernen nach Wert lässt in [a, b, a] ein Duplikat zurück, nachdem remove("a") das erste a entfernt hat.
Exklusive Endgrenze
Eine exklusive Endgrenze bezeichnet die erste ausgelassene Position eines Bereichs, sodass die Anzahl der eingeschlossenen Positionen Ende minus Anfang beträgt.
Die exklusive Endgrenze 5 in substring(2, 5) schließt die Positionen 2, 3 und 4 ein, lässt aber Position 5 aus.

F

Filter
Ein Filter wählt Elemente aus, die eine Bedingung erfüllen, und kann sie in einer neuen Liste sammeln, während die ursprüngliche Collection unverändert bleibt.
Ein Filter behält Wörter mit mindestens fünf Zeichen, indem er passende Wörter zu einer separaten Ergebnisliste hinzufügt.
Flache Kopie
Eine flache Kopie erstellt einen separaten Container und kopiert dabei dessen Elementwerte oder Referenzen, ohne referenzierte Objekte zu duplizieren.
Eine flache Kopie einer String-Liste hat unabhängige Listenplätze, die weiterhin auf dieselben String-Objekte verweisen.
for-each-Schleife
Eine for-each-Schleife durchläuft jeden Elementwert der Reihe nach ohne expliziten Index und legt diesen Wert in einer lokalen Schleifenvariable ab.
Eine for-each-Schleife kann Array-Werte summieren, aber eine Neuzuweisung an ihre int-Variable ersetzt nicht die Array-Speicherplätze.

G

Ganzzahldivision
Die Ganzzahldivision dividiert ganzzahlige Operanden und schneidet den Nachkommateil ab, selbst wenn der entstehende Quotient später als double gespeichert wird.
Durch Ganzzahldivision ist 17 / 4 gleich 4; eine vorherige explizite Typumwandlung eines Operanden ermöglicht das Ergebnis mit Nachkommateil 4,25.

I

Identitätsvergleich
Ein Identitätsvergleich prüft, ob Referenzen dasselbe Objekt bezeichnen, unabhängig davon, ob separate Objekte gleiche Daten enthalten.
Ein Identitätsvergleich mit a == b ist false für separate Arrays, die dieselben Ganzzahlen enthalten.
In-place-Änderung
Eine In-place-Änderung ändert den Zustand eines vorhandenen Objekts, sodass Referenzen, die bereits darauf zeigen, den geänderten Inhalt sehen.
Eine In-place-Änderung mit reverse() ändert den ursprünglichen Builder, sodass auch Aliasse den umgekehrten Text sehen.
Index
Ein Index ist eine bei null beginnende Position, die ein Element in einer Liste, einem Array oder einem String bezeichnet; die erste Position ist 0.
Der Index des letzten Elements einer Liste mit vier Elementen ist 3, daher liest get(3) dieses Element.
Indexbasierte Schleife
Eine indexbasierte Schleife durchläuft Elemente über eine explizite Positionsvariable, sodass der Rumpf Positionen lesen oder gespeicherte Werte ersetzen kann.
Eine indexbasierte Schleife kann Namen mit Zeilennummern ausgeben, indem sie names.get(i) liest und i + 1 anzeigt.
Inhaltliche Gleichheit
Inhaltliche Gleichheit prüft, ob Container entsprechende gleiche Elemente in derselben Reihenfolge enthalten, ohne ein gemeinsames Objekt vorauszusetzen.
Bei int-Arrays wird die inhaltliche Gleichheit mit Arrays.equals(a, b) geprüft, nicht mit equals des Arrays.
Inhaltsvergleich
Ein Inhaltsvergleich prüft in Objekten gespeicherte Zeichen oder Werte, sodass separate String-Objekte übereinstimmen können, wenn ihr Text gleich ist.
Ein Inhaltsvergleich mit reply.equals("go") erkennt übereinstimmenden Text, selbst wenn die Objekte verschieden sind.
Iterator
Ein Iterator verfolgt die Traversierung einer Collection, stellt den nächsten Wert bereit und unterstützt das Entfernen über seine eigene Methode.
Ein Iterator kann die gerade gelesene gerade Zahl mit it.remove() entfernen und dabei die Liste weiter durchlaufen.

K

Konkatenation
Konkatenation verknüpft Werte zu Text; in Java erfolgt die String-Verknüpfung mit + von links nach rechts, sofern Klammern die Gruppierung nicht ändern.
Durch Konkatenation ergibt "N=" + 2 + 5 den Wert "N=25", da die Zahlen angefügt werden, nachdem der Text beginnt.

L

Leerraum (Whitespace)
Leerraum besteht aus Abstands- oder Trennzeichen, die eine bestimmte Prüfung erkennt, darunter Leerzeichen, Tabulatoren und Zeilenumbrüche.
Java-Leerraum wird von Character.isWhitespace erkannt, das auch von strip() und isBlank() verwendet wird.
length-Feld
Das length-Feld gibt die feste Anzahl von Speicherplätzen in einem Array an und wird ohne die Klammern gelesen, die ein Methodenaufruf benötigt.
Das length-Feld in new int[4] ist 4, noch bevor das Programm eigene Werte in die Speicherplätze schreibt.
Lexikografische Ordnung
Die lexikografische Ordnung vergleicht Folgen an ihrer ersten unterschiedlichen Position und ordnet einen kürzeren String mit gleichem Präfix vor einem längeren ein.
Javas lexikografische Ordnung setzt „12“ vor „8“, weil die ersten unterschiedlichen chars '1' und '8' sind.
Lineare Suche
Eine lineare Suche prüft Elemente einzeln, bis ein Treffer die Frage beantwortet oder am Ende feststeht, dass kein Element passt.
Eine lineare Suche nach einem fehlenden Namen in 14 Einträgen prüft alle 14, bevor sie ihre Kennzeichnung für eine erfolglose Suche zurückgibt.
Literales Ersetzen
Literales Ersetzen ersetzt genau übereinstimmenden Text oder Zeichen, ohne das Suchziel als reguläres Ausdrucksmuster zu interpretieren.
Literales Ersetzen mit replace(".", "-") ändert die Punkte in „a.b.c“ zu Bindestrichen.

M

Maximum
Ein Maximum ist der größte Wert in einem nicht leeren Datensatz; eine Schleife kann den bisher größten Wert oder den Index seines Vorkommens festhalten.
Das Maximum von {-7, -2, -5} ist -2, was ein mit null initialisierter bester Wert nicht melden würde.
Methodenüberladung
Eine Methodenüberladung ist eine von mehreren Methoden mit demselben Namen, aber unterschiedlichen Parametertypen oder unterschiedlichen Anzahlen von Parametern.
Die durch ein int-Argument ausgewählte Methodenüberladung zum Entfernen behandelt dieses Argument als Index.
Methodenverkettung
Methodenverkettung ruft eine weitere Methode direkt auf einem Ergebnis auf, das ein vorheriger Aufruf zurückgegeben hat, etwa wenn append denselben Builder zurückgibt.
Methodenverkettung ermöglicht sb.append("x").append(2), kann aber nicht von setCharAt fortgesetzt werden, das void zurückgibt.

N

NaN
NaN bedeutet „keine Zahl“ (not a number) und ist ein Gleitkommaergebnis für Operationen wie die Division einer Summe von null durch eine Anzahl von null.
Ein für leere Daten als 0.0 / 0 berechneter Mittelwert ergibt NaN statt eines brauchbaren Messwerts.
Nicht modifizierbare Liste
Eine nicht modifizierbare Liste lehnt Änderungen an ihren Elementen und ihrer Struktur ab, einschließlich Hinzufügen, Entfernen und Ersetzen.
Die von List.of("east", "west") zurückgegebene nicht modifizierbare Liste lehnt einen späteren Aufruf von set ab.
null
null ist der Referenzwert, der kein Objekt bezeichnet, sodass über diese Referenz keine Instanzmethode aufgerufen werden kann.
Ein null-Ergebnis muss geprüft werden, bevor Code length() auf einem String aufruft, den eine Suche zurückgeben könnte.
NumberFormatException
Eine NumberFormatException meldet, dass Text mit der angeforderten Parsing-Methode nicht in den numerischen Typ umgewandelt werden kann.
Eine NumberFormatException entsteht bei Integer.parseInt(" 18"), weil das führende Leerzeichen nicht akzeptiert wird.

P

Palindrom
Ein Palindrom liest sich nach der gewählten Vergleichsregel vorwärts und rückwärts gleich, etwa wenn Groß- und Kleinschreibung sowie Nichtbuchstaben ignoriert werden.
Eine Palindromprüfung kann Buchstaben normalisieren, einen neuen Builder umkehren und die entstehenden Strings vergleichen.
Parsen
Parsen wandelt Text entsprechend der von der gewählten Methode akzeptierten Syntax in einen strukturierten Wert wie einen int oder double um.
Das Parsen von „3.5“ mit Integer.parseInt schlägt fehl, weil diese Methode Ganzzahltext ohne Dezimalpunkt akzeptiert.

R

Referenz
Eine Referenz ist ein Wert, der ein Objekt bezeichnet und einer Variable Zugriff auf dieses Objekt ermöglicht, statt dessen Inhalt direkt zu enthalten.
Eine kopierte Referenz ermöglicht zwei Variablen, Elemente zu demselben ArrayList-Objekt im Speicher hinzuzufügen.
Regulärer Ausdruck
Ein regulärer Ausdruck ist ein Textmuster, dessen Symbole mehr als nur genaue literale Zeichenübereinstimmungen beschreiben können, wie bei Trennzeichen für String split.
Ein regulärer Ausdruck mit einem nicht maskierten Punkt trifft auf Zeichen zu, statt nur an tatsächlichen Punkten zu trennen.
Rückwärtsgerichtetes Entfernen
Rückwärtsgerichtetes Entfernen durchläuft Listenindizes vom letzten zum ersten, sodass das Löschen nur Elemente verschiebt, die die Schleife bereits geprüft hat.
Rückwärtsgerichtetes Entfernen löscht benachbarte negative Werte, ohne den Wert zu überspringen, der nach dem Löschen nach links rückt.

S

Schleifengrenze
Eine Schleifengrenze ist eine Schranke in der Bedingung einer Schleife, die bestimmt, welche Positionen oder Durchläufe der Rumpf verarbeiten darf.
Eine Schleifengrenze von i < a.length - 1 lässt Raum, um den rechten Nachbarn bei a[i + 1] zu lesen.
Sentinelwert
Ein Sentinelwert ist ein speziell gewähltes Ergebnis, das einen Zustand wie einen fehlenden Treffer kennzeichnet und sich von gewöhnlichen erfolgreichen Ergebnissen unterscheidet.
Der Sentinelwert -1 signalisiert, dass eine Indexsuche erfolglos war, weil kein gültiger Index negativ sein kann.
Standardwert
Ein Standardwert ist der anfängliche Wert, den Java einem neu erstellten Array-Speicherplatz entsprechend seinem Typ zuweist, etwa die Zahl null, false oder die Nullreferenz.
Der Standardwert in jedem Speicherplatz eines neuen String-Arrays ist null, daher können dort noch keine String-Methoden ausgeführt werden.
String
Ein String ist ein unveränderliches Java-Objekt, das Text als Folge von UTF-16-char-Werten darstellt, auf die über bei null beginnende Positionen zugegriffen wird.
Ein String mit einem Namen kann sicher gemeinsam genutzt werden, weil die Umwandlung seiner Groß- und Kleinschreibung das ursprüngliche Objekt nicht ändert.
StringBuilder
Ein StringBuilder ist eine veränderliche Zeichenfolge, die effizientes wiederholtes Anhängen und Bearbeitungen aktueller Positionen oder Bereiche unterstützt.
Ein StringBuilder kann einen mehrzeiligen Bericht zusammenstellen, ohne nach jeder hinzugefügten Zeile das gesamte Präfix neu aufzubauen.
Strukturelle Änderung
Eine strukturelle Änderung ändert die Größe oder die zugrunde liegende Struktur einer ArrayList, etwa durch Hinzufügen oder Entfernen eines Elements während der Traversierung.
Eine strukturelle Änderung über die Ausgangsliste kann den Zustand ihres for-each-Iterators ungültig machen.
Suchergebnis
Ein Suchergebnis gibt an, ob oder wo passende Daten gefunden wurden; Indexsuchen in Listen melden mit -1, dass kein Treffer vorliegt.
Das Suchergebnis von names.indexOf("Kai") kann 0 sein, daher muss eine Prüfung auf einen Treffer diesen Index akzeptieren.
Suchprädikat
Ein Suchprädikat ist eine Wahrheitswertprüfung, die entscheidet, ob ein Element eine Suchbedingung wie ein gefordertes Präfix erfüllt.
Das Suchprädikat city.startsWith("M") findet Namen anhand einer Bedingung statt anhand eines exakten Werts.

T

Teilstring
Ein Teilstring ist ein zusammenhängender Teil eines Strings, der über einen Anfangsindex und optional einen ausgeschlossenen Endindex ausgewählt wird.
Der Teilstring von Index 1 bis einschließlich 3 von "planet" wird mit substring(1, 4) ausgewählt und lautet „lan“.
Temporäre Variable
Eine temporäre Variable hält einen Zwischenwert fest, während andere Zuweisungen die Positionen ändern, aus denen dieser Wert gelesen wurde.
Eine temporäre Variable speichert beim Vertauschen das erste Element, damit die nächste Zuweisung es nicht überschreibt.
Traversierung
Eine Traversierung ist das systematische Durchlaufen von Collection-Elementen, etwa vom ersten bis zum letzten Element mit einer Schleife.
Eine rückwärts gerichtete Traversierung beginnt beim letzten Index und erreicht Index 0, bevor die Schleife endet.

U

Unboxing
Unboxing ist Javas automatische Umwandlung des gespeicherten Werts eines Wrapperobjekts in den zugehörigen primitiven Datentyp.
Unboxing liefert einen int, wenn int first = numbers.get(0); ein Integer-Listenelement liest.
Unveränderlichkeit
Unveränderlichkeit bedeutet, dass der gespeicherte Zustand eines Objekts nach seiner Erstellung nicht geändert werden kann. String-Umwandlungen geben daher Ergebnisse zurück, ohne das Objekt zu bearbeiten.
Die Unveränderlichkeit von Strings lässt einen alten Alias unverändert, wenn eine andere Variable das Ergebnis von toUpperCase() speichert.
UTF-16-Codeeinheit
Eine UTF-16-Codeeinheit ist die Einheit, die ein Java-char speichert; ein angezeigtes Symbol kann eine Einheit oder ein Paar solcher Einheiten benötigen.
Ein Emoji kann zwei UTF-16-Codeeinheiten belegen, was die von String length() zurückgegebene Anzahl beeinflusst.

V

Vergleich unter Beachtung der Groß- und Kleinschreibung
Ein Vergleich unter Beachtung der Groß- und Kleinschreibung behandelt Groß- und Kleinbuchstaben als verschieden, wenn er über die Übereinstimmung von Text entscheidet.
Ein Vergleich unter Beachtung der Groß- und Kleinschreibung mit String equals stellt fest, dass „Go“ und „go“ unterschiedliche Inhalte haben.
Vorzeitige Rückkehr
Eine vorzeitige Rückkehr beendet eine Methode, sobald ihr Ergebnis feststeht, etwa wenn eine Suche nach dem ersten Treffer ein passendes Element erreicht.
Eine vorzeitige Rückkehr aus dem passenden if vermeidet, Namen nach dem ersten Treffer zu prüfen.

W

Wertübergabe (Pass-by-Value)
Wertübergabe bedeutet, dass ein Methodenparameter eine Kopie des Werts eines Arguments erhält, bei einem Objekt also eine kopierte Referenz.
Durch Wertübergabe kann ein Listenparameter gemeinsam genutzte Elemente bearbeiten, während eine Neuzuweisung des Parameters lokal bleibt.
Wrapperklasse
Eine Wrapperklasse stellt einen primitiven Wert als Objekt dar und ermöglicht so, Werte wie Ganzzahlen als Listenelemente zu verwenden.
Die Wrapperklasse Integer ermöglicht es einer ArrayList<Integer>, Zahlen zu speichern, die als int-Werte übergeben werden.

Z

Zusammenfügen
Eine Operation zum Zusammenfügen verbindet Textteile zu einem String, wobei ein gewähltes Trennzeichen zwischen den Teilen statt nach dem letzten Teil steht.
Das Zusammenfügen mit String.join("/", pieces) wandelt die Teile „a“, „b“ und „c“ in den Text „a/b/c“ um.

Über diese Einheit

Von StudeliFehler melden

Erstelle deine eigenen Lernmaterialien

Mach aus deinen Notizen, Folien und Dokumenten Lernleitfäden, Übungsfragen, Karteikarten und 6 weitere Tools.

Jetzt starten