Atualizado: 16/08/2025

Este conteúdo é original e não foi gerado por inteligência artificial.

List e ArrayList em Java

Em Java, quando se trabalha com coleções de dados, é comum precisar armazenar vários elementos em sequência. Para isso, existe a interface List, que define um tipo de coleção onde cada item ocupa uma posição (índice) e pode ser acessado diretamente por esse índice.

A implementação mais usada dessa interface é a classe ArrayList, que funciona como um "array dinâmico". Diferente de um array comum, que tem tamanho fixo, um ArrayList pode crescer ou diminuir conforme novos elementos são adicionados ou removidos.


Principais operações em listas

A interface List e a classe ArrayList oferecem métodos prontos para trabalhar com os elementos:

  • Adicionar elementos: com add, é possível colocar um item no final da lista ou em uma posição específica.
  • Acessar elementos: o método get retorna o item que está em determinado índice.
  • Substituir elementos: com set, um item existente pode ser trocado por outro.
  • Descobrir o tamanho: o método size retorna quantos elementos existem na lista.
  • Verificar se contém: o método contains informa se um valor está presente.
  • Remover elementos: com remove, um item pode ser retirado pelo valor ou pelo índice.
  • Converter em array: com toArray, a lista pode ser transformada em um array comum.

Construtores de ArrayList

A classe ArrayList pode ser criada de diferentes formas:

  • new ArrayList<>(): cria uma lista vazia.
  • new ArrayList<>(colecao): cria a lista já com os elementos de outra coleção.
  • new ArrayList<>(capacidadeInicial): cria uma lista com uma capacidade mínima pré-definida.

Definir a capacidade inicial é útil quando já se sabe quantos elementos, em média, serão usados, pois evita que a lista precise realocar memória várias vezes.


Exemplo prático

O código abaixo mostra como criar um ArrayList de strings e trabalhar com alguns dos métodos mais comuns:

import java.util.ArrayList;

public class Program {
    public static void main(String[] args) {
        ArrayList<String> people = new ArrayList<String>();

        people.add("Tom");
        people.add("Alice");
        people.add("Kate");
        people.add("Sam");
        people.add(1, "Bob"); // adiciona no índice 1

        System.out.println(people.get(1)); // acessa o elemento no índice 1
        people.set(1, "Robert"); // substitui o elemento no índice 1

        System.out.printf("ArrayList has %d elements \n", people.size());
        for(String person : people){
            System.out.println(person);
        }

        if(people.contains("Tom")){
            System.out.println("ArrayList contains Tom");
        }

        people.remove("Robert");
        people.remove(0);

        Object[] peopleArray = people.toArray();
        for(Object person : peopleArray){
            System.out.println(person);
        }
    }
}

Saída esperada

Bob
ArrayList has 5 elements
Tom
Robert
Alice
Kate
Sam
ArrayList contains Tom
Alice
Kate
Sam

Observações importantes

No exemplo acima, o ArrayList foi configurado para armazenar apenas elementos do tipo String. Esse recurso se chama generics: ao indicar ArrayList<String>, a lista aceita apenas valores do tipo String.

Embora o ArrayList cresça automaticamente quando precisa armazenar mais elementos, internamente ele ainda usa um array como estrutura base. Isso significa que, quando a capacidade é ultrapassada, um novo array é criado e os elementos antigos são copiados, o que consome processamento.

Por isso, em cenários onde já se sabe que a lista terá, por exemplo, cerca de 25 elementos, é melhor declarar assim:

ArrayList<String> people = new ArrayList<String>(25);

Ou então garantir a capacidade mínima com o método:

people.ensureCapacity(25);

Esses cuidados ajudam a tornar o programa mais eficiente.


Resumo

  • List é a interface que define listas em Java.
  • ArrayList é a implementação mais comum dessa interface.
  • Permite adicionar, acessar, substituir e remover elementos com facilidade.
  • O tamanho da lista é dinâmico, mas internamente usa um array.
  • Definir uma capacidade inicial ajuda a evitar custos extras de realocação.

📝 Exercícios

Tarefa 1: Criar uma Sublista

Objetivo: Complete o método criarSublista para que ele receba uma lista de nomes e retorne apenas os elementos entre os índices start e end.

Código inicial:

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> nomes = new ArrayList<>();
        nomes.add("Tom");
        nomes.add("Alice");
        nomes.add("Kate");
        nomes.add("Sam");
        nomes.add("Bob");

        List<String> sub = criarSublista(nomes, 1, 4);
        System.out.println(sub); // Esperado: [Alice, Kate, Sam]
    }

    static List<String> criarSublista(ArrayList<String> lista, int start, int end) {
        // Escreva seu código aqui.
        // Você precisa retornar uma sublista de lista.

    }
}
Resposta
static List<String> criarSublista(ArrayList<String> lista, int start, int end) {
    return lista.subList(start, end);
}

Explicação: O método subList(start, end) cria uma visão parcial da lista original, contendo os elementos entre os índices start (inclusivo) e end (exclusivo). Alterações feitas na sublista também refletem na lista original.


Tarefa 2: Ordenar Números em Ordem Decrescente

Objetivo: Complete o método ordenarDecrescente para que ele organize uma lista de inteiros do maior para o menor.

Código inicial:

import java.util.ArrayList;
import java.util.Comparator;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> numeros = new ArrayList<>();
        numeros.add(5);
        numeros.add(1);
        numeros.add(9);
        numeros.add(3);

        ordenarDecrescente(numeros);
        System.out.println(numeros); // Esperado: [9, 5, 3, 1]
    }

    static void ordenarDecrescente(ArrayList<Integer> lista) {
        // Escreva seu código aqui.
        // Você precisa ordenar em ordem decrescente.

    }
}
Resposta
static void ordenarDecrescente(ArrayList<Integer> lista) {
    lista.sort(Comparator.reverseOrder());
}

Explicação: O método sort organiza os elementos da lista usando um Comparator. Quando se usa Comparator.reverseOrder(), a ordem natural é invertida. Para inteiros, isso significa ordenar do maior para o menor.


Tarefa 3: Encontrar Primeira e Última Ocorrência

Objetivo: Complete o método encontrarIndices para que ele mostre o índice da primeira e da última ocorrência de um valor em uma lista.

Código inicial:

import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        ArrayList<String> palavras = new ArrayList<>();
        palavras.add("Java");
        palavras.add("C++");
        palavras.add("Java");
        palavras.add("Python");
        palavras.add("Java");

        encontrarIndices(palavras, "Java");
        // Esperado:
        // Primeira ocorrência: 0
        // Última ocorrência: 4
    }

    static void encontrarIndices(ArrayList<String> lista, String valor) {
        // Escreva seu código aqui.
        // Você precisa mostrar primeira e última ocorrência.

    }
}
Resposta
static void encontrarIndices(ArrayList<String> lista, String valor) {
    int primeiro = lista.indexOf(valor);
    int ultimo = lista.lastIndexOf(valor);

    System.out.println("Primeira ocorrência: " + primeiro);
    System.out.println("Última ocorrência: " + ultimo);
}
Política de Privacidade

Copyright © www.programicio.com Todos os direitos reservados

É proibida a reprodução do conteúdo desta página sem autorização prévia do autor.

Contato: programicio@gmail.com