O conteúdo desse estudo foi feito durante o Curso de Desenvolvimento Java, lecionado pela Giuliana Silva Bezerra.
Aconselho veemente que você utilize este material como um complemento ao curso, e não como substituto do mesmo. A didática dela é incrível e você aprenderá muito mais seguindo o curso oficial.
Introdução
No desenvolvimento de software, frequentemente precisamos gerenciar grupos de objetos relacionados.
Em Java, as Collections fornecem uma maneira poderosa e flexível de armazenar, organizar e manipular esses grupos. Neste artigo, exploraremos os principais tipos de Collections em Java e como utilizá-los efetivamente.
Arrays vs Collections
| Arrays | Collections |
|---|---|
| Tamanho fixo | Tamanho dinâmico |
| Trabalham com tipos primitivos | Trabalham com objetos |
| Poucos métodos utilitários | Muitos métodos prontos (add, remove, sort, etc.) |
// Array (tamanho fixo)String[] nomes = new String[3];
// Collection (tamanho cresce automaticamente)List<String> nomes = new ArrayList<>();O ArrayList aumenta sua capacidade automaticamente quando necessário.
Interface List e ArrayList
ArrayList é a implementação mais usada da interface List.
List<String> frutas = new ArrayList<>();Por que declarar como List?
Boa prática de orientação a interfaces, você pode trocar a implementação depois sem mudar o resto do código.
List<String> frutas = new LinkedList<>(); // Troca fácil➕ Adicionando elementos
List<String> nomes = new ArrayList<>();
nomes.add("Ana");nomes.add("Bruno");nomes.add("Carlos");Inicializando já com valores:
List<String> nomes = new ArrayList<>(Arrays.asList("Ana", "Bruno", "Carlos"));List.of() cria uma lista imutável, então usamos new ArrayList<>(…) para torná-la mutável.
🔍 Acessando elementos (GET)
List<String> nomes = new ArrayList<>(Arrays.asList("Ana", "Bruno", "Carlos"));
System.out.println(nomes.get(0)); // Ana⚠ Se acessar um índice inválido:
nomes.get(10); // IndexOutOfBoundsException✏️ Inserir e Atualizar
Inserir em posição específica
nomes.add(1, "Beatriz"); // Insere "Beatriz" na posição` 1Atualizar elemento
nomes.set(2, "Carla"); // Atualiza índice 2 para "Carla"❌ Remover
Remover por valor:
nomes.remove("Bruno"); // Remove por valorRemover por índice:
nomes.remove(0); // Remove por índice📏 Tamanho da lista
int tamanho = nomes.size(); // Retorna o tamanho da lista🔁 Percorrendo a lista
Podemos percorrer usando for tradicional, foreach ou streams:
🔹For tradicional
List<String> nomes = new ArrayList<>(Arrays.asList("Ana", "Bruno", "Carlos"));
for (int i = 0; i < nomes.size(); i++) { System.out.println(nomes.get(i));}🔹For-each
for (String nome : nomes) { System.out.println(nome);}🔹forEach com lambda
nomes.forEach(nome -> System.out.println(nome));🔹Usando Iterator
Útil quando precisa remover durante a iteração.
Iterator<String> it = nomes.iterator();
while (it.hasNext()) { String nome = it.next(); if (nome.equals("Bruno")) { it.remove(); }}🔄 Ordenando a lista
Collections.sort(nomes); // Ordena em ordem alfabéticaOrdem reversa
Collections.sort(nomes, Collections.reverseOrder());Ordenar objetos por campo
nomes.sort(Comparator.comparing(String::length));🔄 Conversão entre Array e List
Array → List
String[] array = {"A", "B", "C"};List<String> lista = new ArrayList<>(Arrays.asList(array));List → Array
String[] novoArray = lista.toArray(new String[0]);🗺 Trabalhando com Map e HashMap
Map armazena dados no formato chave → valor.
Map<String, String> usuarios = new HashMap<>();➕ Adicionar elementos
usuarios.put("joao", "João Silva");usuarios.put("maria", "Maria Souza");🔍 Buscar valor pela chave
System.out.println(usuarios.get("joao"));✏️ Atualizar valor
usuarios.put("joao", "João Pereira"); // substitui o valor antigo❌ Remover
usuarios.remove("maria");📏 Tamanho do Map
int tamanho = usuarios.size();🔁 Iterando no Map
🔹Apenas chaves
for (String chave : usuarios.keySet()) { System.out.println(chave);}🔹Apenas valores
for (String valor : usuarios.values()) { System.out.println(valor);}🔹Chave e valor (mais completo)
for (Map.Entry<String, String> entry : usuarios.entrySet()) { System.out.println(entry.getKey() + " -> " + entry.getValue());}🧠 Quando usar cada estrutura?
| Estrutura | Use quando… |
|---|---|
| ArrayList | Precisa de lista com acesso rápido por índice |
| LinkedList | Muitas inserções/remoções no meio (raro na prática) |
| HashSet | Não quer elementos repetidos |
| HashmMap | Precisa buscar valores rapidamente por chave |
Resumão Brabo
- ✔ Collections são dinâmicas
- ✔ List mantém ordem e permite repetidos
- ✔ Map trabalha com chave única → valor
- ✔ ArrayList e HashMap são as implementações mais usadas
- ✔ Sempre prefira declarar pela interface (List, Map)