Java: List e ArrayList

ArrayList é a coleção mais comumente usada. Esta lição cobre o uso detalhado de List.

1. ArrayList

ArrayList é um array dinâmico baseado em implementação de array.

(1) Características

Característica Descrição
Ordenada Elementos na ordem de inserção
Permite duplicatas Pode ter elementos iguais
Acesso por índice Acessar elementos por índice
Crescimento dinâmico Expansão automática de capacidade

(2) Criando ArrayList

TEXT 📖 Somente leitura
import java.util.ArrayList;
import java.util.List;

// Método 1: Capacidade padrão
List<String> list1 = new ArrayList<>();

// Método 2: Capacidade especificada
List<String> list2 = new ArrayList<>(100);

// Método 3: De outra coleção
List<String> list3 = new ArrayList<>(list1);

2. Operações Básicas

(1) Adicionando Elementos

JAVA
List<String> list = new ArrayList<>();

list.add("Alice");        // Adicionar ao final
list.add("Bob");
list.add(0, "Charlie");   // Adicionar em posição específica

System.out.println(list);  // [Charlie, Alice, Bob]

(2) Obtendo Elementos

TEXT 📖 Somente leitura
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

String first = list.get(0);  // Alice
int size = list.size();       // 2

(3) Modificando Elementos

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");

list.set(0, "Charlie");  // Mudar primeiro elemento para Charlie
System.out.println(list);  // [Charlie, Bob]

(4) Removendo Elementos

TEXT 📖 Somente leitura
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

list.remove(0);           // Remover por índice
list.remove("Bob");       // Remover por conteúdo
System.out.println(list);  // [Charlie]

(5) Encontrando Elementos

JAVA
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

boolean has = list.contains("Bob");    // true
int index = list.indexOf("Charlie");   // 2
int lastIndex = list.lastIndexOf("Alice");  // 0

3. Métodos de Travessia

(1) Método 1: Loop for

TEXT 📖 Somente leitura
List<String> list = new ArrayList<>();
list.add("Alice");
list.add("Bob");
list.add("Charlie");

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

(2) Método 2: for-each

JAVA
for (String name : list) {
    System.out.println(name);
}

(3) Método 3: Iterator

TEXT 📖 Somente leitura
Iterator<String> it = list.iterator();
while (it.hasNext()) {
    System.out.println(it.next());
}

(4) Método 4: Lambda

JAVA
list.forEach(name -> System.out.println(name));
list.forEach(System.out::println);

4. Ordenação

(1) Usando Collections.sort()

TEXT 📖 Somente leitura
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

List<Integer> numbers = new ArrayList<>();
numbers.add(3);
numbers.add(1);
numbers.add(4);
numbers.add(1);
numbers.add(5);

Collections.sort(numbers);  // Ascendente
System.out.println(numbers);  // [1, 1, 3, 4, 5]

Collections.sort(numbers, Collections.reverseOrder());  // Descendente
System.out.println(numbers);  // [5, 4, 3, 1, 1]

(2) Usando Comparator

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

List<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");

// Ordem alfabética
names.sort((a, b) -> a.compareTo(b));
System.out.println(names);  // [Alice, Bob, Charlie]

// Por comprimento
names.sort(Comparator.comparingInt(String::length));
System.out.println(names);  // [Bob, Alice, Charlie]

5. Outros Métodos Comuns

Método Descrição
addAll(Collection) Adicionar todos os elementos
removeAll(Collection) Remover todos os elementos correspondentes
retainAll(Collection) Manter interseção
clear() Limpar tudo
isEmpty() Está vazio
toArray() Converter para array
subList(int, int) Obter sublista

▶ Exemplo: Operações em Lote

TEXT 📖 Somente leitura
List<String> list1 = new ArrayList<>();
list1.add("A");
list1.add("B");
list1.add("C");

List<String> list2 = new ArrayList<>();
list2.add("B");
list2.add("C");
list2.add("D");

// União
List<String> union = new ArrayList<>(list1);
union.addAll(list2);
System.out.println("União: " + union);  // [A, B, C, B, C, D]

// Interseção
List<String> intersection = new ArrayList<>(list1);
intersection.retainAll(list2);
System.out.println("Interseção: " + intersection);  // [B, C]

// Diferença
List<String> diff = new ArrayList<>(list1);
diff.removeAll(list2);
System.out.println("Diferença: " + diff);  // [A]

6. LinkedList

LinkedList é uma implementação de List baseada em lista duplamente encadeada.

(1) Características

Característica ArrayList LinkedList
Estrutura subjacente Array Lista duplamente encadeada
Acesso aleatório O(1) O(n)
Inserir no início O(n) O(1)
Inserir no final O(1) O(1)
Uso de memória Menos Mais (ponteiros)

(2) Métodos Específicos do LinkedList

JAVA
LinkedList<String> linkedList = new LinkedList<>();

// Operações de início/fim
linkedList.addFirst("A");
linkedList.addLast("B");
linkedList.addLast("C");

String first = linkedList.getFirst();
String last = linkedList.getLast();

linkedList.removeFirst();
linkedList.removeLast();

(3) Guia de Seleção

Cenário Recomendação
Acesso aleatório frequente ArrayList
Inserção/remoção frequente no início LinkedList
Uso geral ArrayList

▶ Exemplo: Gerenciamento de Notas de Estudantes

JAVA
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

public class StudentGrade {
    private String name;
    private int score;
    
    public StudentGrade(String name, int score) {
        this.name = name;
        this.score = score;
    }
    
    public String getName() { return name; }
    public int getScore() { return score; }
    
    @Override
    public String toString() {
        return name + ": " + score;
    }
    
    public static void main(String[] args) {
        List<StudentGrade> students = new ArrayList<>();
        students.add(new StudentGrade("Alice", 95));
        students.add(new StudentGrade("Bob", 88));
        students.add(new StudentGrade("Charlie", 92));
        students.add(new StudentGrade("David", 85));
        
        // Ordenar por pontuação descendente
        students.sort((a, b) -> b.getScore() - a.getScore());
        System.out.println("Ordenado por pontuação:");
        students.forEach(System.out::println);
        
        // Encontrar maior pontuação
        StudentGrade top = students.stream()
            .max(Comparator.comparingInt(StudentGrade::getScore))
            .orElse(null);
        System.out.println("Maior: " + top);
        
        // Calcular média
        double avg = students.stream()
            .mapToInt(StudentGrade::getScore)
            .average()
            .orElse(0);
        System.out.printf("Média: %.1f%n", avg);
    }
}
▶ Experimente

❓ Perguntas Frequentes

P: Qual é a capacidade inicial do ArrayList? R: O padrão é 10. Se você souber o tamanho aproximado, especifique-o no construtor para redimensionamento.

P: Qual é o mecanismo de redimensionamento do ArrayList? R: Cada redimensionamento aumenta a capacidade em 1,5 vezes.

P: List pode armazenar null? R: Tanto ArrayList quanto LinkedList podem armazenar null.

📖 Resumo

📝 Exercícios

  1. Desduplicação: Remova elementos duplicados de um ArrayList
  2. Mesclar: Mescle duas Lists ordenadas em uma List ordenada
  3. Contagem: Conte as ocorrências de cada elemento em uma List

7. Próxima Lição

Na próxima lição, aprenderemos sobre Set e HashSet — entendendo o mecanismo de desduplicação de Set.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%