HOWTO · Java

Das letzte Element aus einer ArrayList in Java abrufen

In diesem Beitrag geht es darum, das letzte Element aus einer ArrayList in Java zu erhalten.

Auf dieser Seite

Um das letzte Element einer Java-ArrayList abzurufen, lesen Sie das Element an der Stelle list.get(list.size() - 1). Java verwendet nullbasierte Indizes, daher ist der letzte gültige Index um eins kleiner als die Listengröße. Anders als Python-Listen unterstützen Java-Listen keine negativen Indizes wie -1 für das letzte Element.

Letztes Element mit size() und get() abrufen

Rufen Sie size() auf, um die Anzahl der Listenelemente zu ermitteln. Ziehen Sie eins ab, um den letzten Index zu berechnen, und übergeben Sie diesen Index an get(). Eine Liste mit vier Elementen hat beispielsweise die gültigen Indizes 0 bis 3; ihr letztes Element befindet sich also am Index 4 - 1.

Führen Sie dieses Beispiel aus:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import java.util.ArrayList;

public class LastElement {
    public static void main(String[] args) {
        ArrayList<Integer> numbers = new ArrayList<>();
        numbers.add(10);
        numbers.add(20);
        numbers.add(30);
        numbers.add(40);

        int last = numbers.get(numbers.size() - 1);
        System.out.println(last);
    }
}
40

Dieser direkte Zugriff ist die übliche Wahl, wenn der Wert eine ArrayList ist und Sie ihr letztes Element benötigen. Dafür brauchen Sie weder einen Stream noch eine kopierte Teilliste oder eine Umwandlung in eine andere Sammlung.

Eine leere ArrayList behandeln

Eine leere Liste hat die Größe null. Daher ergibt size() - 1 den Wert -1. Wird dieser Index an get() übergeben, wird eine IndexOutOfBoundsException ausgelöst. Prüfen Sie die Liste vor dem Zugriff und wählen Sie ein Ergebnis, das zum Bedarf des aufrufenden Codes passt.

Wenn eine Methode „kein Element“ durch null darstellt, sollte sie diesen Vertrag ausdrücklich festlegen. Diese Hilfsfunktion weist außerdem eine null-Liste zurück, statt sie wie eine leere Liste zu behandeln. Die unveränderte Beispielausgabe „No elements“ bleibt auf Englisch:

Der Code und die angezeigten Bezeichnungen oder Ausgaben in diesem Abschnitt bleiben auf Englisch.

import java.util.ArrayList;

public class LastElement {
    static <T> T lastOrNull(ArrayList<T> list) {
        if (list == null) {
            throw new IllegalArgumentException("list must not be null");
        }
        return list.isEmpty() ? null : list.get(list.size() - 1);
    }

    public static void main(String[] args) {
        ArrayList<String> names = new ArrayList<>();
        String last = lastOrNull(names);
        System.out.println(last == null ? "No elements" : last);
    }
}
No elements

null zurückzugeben ist einfach, doch aufrufender Code muss dann zwischen „kein Element“ und einem tatsächlich in der Liste enthaltenen Nullwert unterscheiden. Ist diese Unterscheidung wichtig, geben Sie stattdessen ein Optional<T> zurück oder lassen Sie den Aufrufer die leere Liste behandeln, bevor er get() aufruft. Fangen Sie IndexOutOfBoundsException nicht ab, um die Entscheidung darüber zu umgehen, was eine leere Eingabe bedeuten soll.

Für wiederholte Zugriffe auf das Listenende eine passende Sammlung wählen

Bei einem einzelnen Zugriff verursacht die Umwandlung einer ArrayList in eine ArrayDeque oder LinkedList zusätzlichen Speicherbedarf und kopiert die Elemente, ohne der ursprünglichen Liste einen Vorteil zu verschaffen. Behalten Sie die ArrayList bei und verwenden Sie ihren letzten Index.

Fügt das Programm wiederholt Elemente an beiden Enden ein und entfernt sie dort, wählen Sie von Anfang an eine Deque, die zu diesem Zugriffsmuster passt. Eine ArrayDeque bietet Operationen an den Enden wie addLast() und getLast(); auch eine LinkedList stellt getLast() bereit, hat jedoch andere Speicher- und Platzbedarfseigenschaften. Diese Typen sind bei der Wahl der Sammlung zu erwägen, keine Abkürzung für einen einzelnen Lesezugriff. Eine ArrayDeque erlaubt keine Null-Elemente. Berücksichtigen Sie das, wenn Nullwerte Teil Ihres Datenmodells sind.

Guavas Iterables.getLast() verwenden

Wenn das Projekt bereits von Guava abhängt, ist Iterables.getLast(iterable) eine optionale Alternative für ein Iterable. Die offizielle Guava-API-Dokumentation zu Iterables.getLast() beschreibt beide Überladungen: Die Methode mit einem Argument löst bei einer leeren Iterable eine NoSuchElementException aus, während Iterables.getLast(iterable, defaultValue) den angegebenen Standardwert zurückgibt, wenn keine Elemente vorhanden sind.

Diese Möglichkeit setzt voraus, dass Guava im Klassenpfad des Projekts liegt; sie gehört nicht zur Java-Standardbibliothek. Wenn Sie für eine ArrayList keinen anderen Grund für Guava haben, bleiben Sie mit size() und get() unabhängig von zusätzlichen Abhängigkeiten.

Zusammenfassung

Rufen Sie list.get(list.size() - 1) auf, um das letzte Element einer nicht leeren ArrayList abzurufen. Prüfen Sie zuerst, ob die Liste leer ist, und legen Sie fest, wie der Fall ohne Element behandelt werden soll: Bei einer leeren Liste ergibt sich der Index -1, und get() löst eine IndexOutOfBoundsException aus. Vermeiden Sie die Umwandlung der Liste für einen einzelnen Zugriff. Ziehen Sie eine ArrayDeque oder eine andere Sammlung nur dann in Betracht, wenn das umfassendere Zugriffsmuster wiederholte Operationen an beiden Enden erfordert. Guavas Iterables.getLast() ist eine Option, wenn diese Abhängigkeit ohnehin sinnvoll ist.