List e ArrayList

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

ArrayList

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

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

Criando ArrayList

JAVA
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);

Operações Básicas

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]

Obtendo Elementos

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

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

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]

Removendo Elementos

JAVA
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]

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

Métodos de Travessia

Método 1: Loop for

JAVA
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));
}

Método 2: for-each

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

Método 3: Iterator

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

Método 4: Lambda

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

Ordenação

Usando Collections.sort()

JAVA
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]

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]

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

JAVA
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]
▶ Experimente

LinkedList

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

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)

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();

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);
    }
}

❓ 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

Próxima Lição

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

100%