Lições do módulo (2/2)
Coleções e ArrayList
Os arrays tradicionais em Java possuem um tamanho fixo definido no momento da criação. Para trabalhar com listas de dados cujo tamanho pode variar dinamicamente, Java fornece o Java Collections Framework. A classe mais comumente usada é ArrayList.
A classe ArrayList e os genéricos
ArrayList implementa um array redimensionável na memória. Para declarar um ArrayList, devemos especificar o tipo de elementos que ele conterá, colocando-o entre colchetes angulares < >. Esse recurso é chamado de Genéricos.
Para usar ArrayList, devemos importá-lo no início do arquivo de java.util.ArrayList.
Declaração e instanciação:
import java.util.ArrayList;
ArrayList<String> shoppingList = new ArrayList<>();Métodos principais
Aqui estão as operações fundamentais em um ArrayList:
add(element): Adiciona um elemento ao final da lista.get(index): Retorna o elemento no índice especificado (indexado 0).size(): Retorna o número de elementos atualmente na lista.remove(index): Remove o elemento no índice especificado.
shoppingList.add("Pane");
shoppingList.add("Latte");
System.out.println("Elementi: " + shoppingList.size()); // Prints 2
System.out.println("Primo elemento: " + shoppingList.get(0)); // Prints "Pane"Iterando em uma lista (para cada)
O loop for-each é a estrutura ideal para iterar todos os elementos de uma coleção:
for (String item : shoppingList) {
System.out.println(item);
}Array vs ArrayList: memória e desempenho
Embora ArrayList seja muito mais flexível que um array estático, ele vem com compensações de desempenho e memória:
- Static Array: É alocado em um bloco contíguo de memória, possui tamanho fixo e o acesso aos elementos via índice é extremamente rápido. Ele armazena tipos primitivos diretamente, sem sobrecarga.
- ArrayList: Internamente, gerencia um array que é redimensionado (criando um novo array maior e copiando elementos antigos) quando sua capacidade inicial (geralmente 10) é excedida. Além disso, armazena apenas referências de objetos, introduzindo sobrecarga de memória para cada elemento.
Autoboxing e Unboxing
Como ArrayList só pode conter objetos, Java executa automaticamente conversões entre tipos primitivos e suas respectivas classes wrapper:
- Autoboxing: conversão automática de um tipo primitivo para uma classe wrapper. Por exemplo, quando você escreve
numbers.add(42), Java converte automaticamente42(int) emInteger.valueOf(42)(inteiro). - Unboxing: conversão automática de uma classe wrapper para um tipo primitivo. Por exemplo, quando você executa
int num = numbers.get(0), Java converte internamenteIntegeremint.
Experimente você mesmo
Importe ArrayList, declare um ArrayList de nomes nomeados de String. Adicione Alice e Bob à lista e imprima seu tamanho usando o método size().
Mostrar dica
Inclua `import java.util.ArrayList;` no topo. Crie a lista com `ArrayList<String>names = new ArrayList<>();`, adicione os elementos e imprima seu tamanho com `names.size()`.
Solução disponível após 3 tentativas
Declare um ArrayList de números nomeados inteiros, adicione o número 42 e imprima-o recuperando-o no índice 0 usando get().
Mostrar dica
Use `ArrayList<Integer> numbers = new ArrayList<>();` (com a classe wrapper Integer) e imprima-o com `System.out.println(numbers.get(0));`.
Solução disponível após 3 tentativas
Declare um ArrayList de String nomeado cores. Adicione as cores Vermelho, Verde e Azul à lista. Por fim, use um loop for-each para percorrer a lista e imprimir cada cor na tela.
Mostrar dica
Declare a lista com `ArrayList<String> cores = new ArrayList<>();`, adicione as três cores e use um loop `for (String c : cores)` para imprimi-las usando `System.out.println(c);`.
Solução disponível após 3 tentativas