HOWTO · Java

Obtenha o último elemento de um ArrayList em Java

Esta postagem trata de obter o último elemento de uma ArrayList em Java.

Nesta página

Para obter o último elemento de um ArrayList em Java, leia o elemento na posição list.get(list.size() - 1). Java usa índices começando em zero; por isso, o último índice válido é um a menos que o tamanho da lista. Diferentemente das listas do Python, as listas em Java não aceitam índices negativos, como -1, para acessar o elemento final.

Obtenha o último elemento com size() e get()

Chame size() para saber quantos elementos a lista contém, subtraia um para calcular o último índice e passe esse índice para get(). Por exemplo, uma lista com quatro elementos tem índices válidos de 0 a 3; assim, seu último elemento está no índice 4 - 1.

Execute este exemplo. O exemplo e os rótulos ou saídas exibidos nesta seção permanecem em inglês:

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

Essa consulta direta costuma ser a opção mais adequada quando o valor é um ArrayList e você precisa do elemento final. Ela não exige uma stream, uma sublista copiada nem a conversão para outra coleção.

Trate uma ArrayList vazia

Uma lista vazia tem tamanho zero; portanto, size() - 1 resulta em -1. Passar esse índice para get() lança IndexOutOfBoundsException. Verifique a lista antes de acessá-la e escolha um resultado adequado às necessidades de quem chama o método.

Se um método representar “nenhum elemento” com null, deixe esse contrato explícito. Este auxiliar também rejeita uma lista nula, em vez de tratá-la como vazia. No exemplo, a saída textual No elements permanece em inglês:

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

Retornar null é simples, mas quem chama o método precisa distinguir “nenhum elemento” de um valor null legítimo na lista. Se essa distinção for importante, retorne um Optional<T> ou deixe que o código chamador trate a lista vazia antes de chamar get(). Não capture IndexOutOfBoundsException como substituto para decidir o que uma entrada vazia deve significar.

Escolha uma coleção para acessar as extremidades repetidamente

Para uma única consulta, converter um ArrayList em ArrayDeque ou LinkedList exige alocação e cópia dos elementos, sem beneficiar a lista original. Mantenha o ArrayList e use seu último índice.

Se o programa adiciona e remove elementos repetidamente nas duas extremidades, escolha desde o início um deque adequado a esse padrão de acesso. ArrayDeque oferece operações nas extremidades, como addLast() e getLast(); LinkedList também oferece getLast(), mas tem características diferentes de armazenamento e uso de memória. Essas opções devem ser consideradas ao projetar a coleção, não como atalhos para uma única leitura. ArrayDeque não permite elementos nulos; leve isso em conta se valores nulos fizerem parte do modelo de dados.

Use Iterables.getLast() do Guava

Se o projeto já depende do Guava, Iterables.getLast(iterable) é uma alternativa opcional para um Iterable. A documentação oficial da API do Guava para Iterables.getLast() descreve as duas sobrecargas: o método com um argumento lança NoSuchElementException quando o iterable está vazio, enquanto Iterables.getLast(iterable, defaultValue) retorna o valor padrão fornecido quando não há elementos.

Essa opção exige que o Guava esteja no classpath do projeto; ele não faz parte da biblioteca padrão do Java. Para um ArrayList em um projeto que não precise do Guava por outros motivos, size() e get() mantêm o código sem dependências adicionais.

Resumo

Use list.get(list.size() - 1) para recuperar o último elemento de um ArrayList não vazio. Primeiro verifique se a lista está vazia e defina claramente o que fazer quando não houver elemento, pois uma lista vazia produz o índice -1 e get() lança IndexOutOfBoundsException. Evite converter a lista para uma única consulta; considere ArrayDeque ou outra coleção somente quando o padrão mais amplo exigir operações repetidas nas extremidades. Iterables.getLast() do Guava é uma opção quando essa dependência já for adequada.