Collections Framework em Java

Introdução
O “Collections Framework” é um dos pilares da linguagem Java, ele oferece um conjunto robusto de interfaces e classes que facilitam o armazenamento, manipulação e processamento de grupos de objetos, desde listas simples até estruturas mais complexas como mapas ordenados e conjuntos sem duplicidade, o framework fornece alta performance, segurança e grande flexibilidade.
Neste artigo vamos explorar os principais componentes do Collections Framework: Vector, ArrayList, LinkedList, Iterator, Generics, Set, HashSet, TreeSet, Map, HashMap, Hashtable, LinkedHashMap e TreeMap, sempre acompanhados de explicações teóricas e exemplos práticos em Java.
1 – Vector
Vector é uma classe de lista dinâmica introduzida no Java 1.0, anterior ao Collections Framework. Sua característica principal é ser síncrona, ou seja, thread-safe por padrão. No entanto, isso a torna menos eficiente do que alternativas modernas como ArrayList.
Vector<String> nomes = new Vector<>();
nomes.add("Ana");
nomes.add("Carlos");
nomes.add("Maria");
System.out.println(nomes);
2 – ArrayList
ArrayList é a implementação de lista mais utilizada. Baseado em arrays dinâmicos, permite acesso rápido por índice e redimensionamento automático. Não é sincronizado, o que garante excelente desempenho em cenários single-thread.
ArrayList<String> lista = new ArrayList<>();
lista.add("Java");
lista.add("Python");
lista.add("C++");
System.out.println(lista.get(0)); // Java
3 – Listas com Generics
Generics garantem segurança de tipos em tempo de compilação, prevenindo ClassCastException e melhorando a legibilidade.
List<Integer> numeros = new ArrayList<>();
numeros.add(10);
numeros.add(20);
int soma = numeros.get(0) + numeros.get(1);
System.out.println(soma); // 30
4 – Listas com Iterator
A interface Iterator permite percorrer coleções de forma segura, principalmente ao remover elementos durante a iteração.
List<String> lista = new ArrayList<>();
lista.add("A");
lista.add("B");
lista.add("C");
Iterator<String> it = lista.iterator();
while (it.hasNext()) {
String valor = it.next();
if (valor.equals("B")) {
it.remove();
}
}
System.out.println(lista); // [A, C]
5 – LinkedList
LinkedList é baseada em uma lista duplamente encadeada. É eficiente para inserções e remoções em qualquer posição, mas possui acesso mais lento por índice.
LinkedList<String> fila = new LinkedList<>();
fila.add("Cliente 1");
fila.add("Cliente 2");
fila.addFirst("Cliente VIP");
System.out.println(fila);
6 – Set
Set é uma coleção que não permite elementos duplicados. Sua implementação mais comum é o HashSet.
7 – HashSet
Armazena elementos sem ordem definida. Utiliza hashcode() para garantir unicidade e performance.
Set<String> frutas = new HashSet<>();
frutas.add("Maçã");
frutas.add("Banana");
frutas.add("Laranja");
frutas.add("Maçã"); // ignorado
System.out.println(frutas);
8 – TreeSet
Implementação de Set que mantém seus elementos ordenados de forma natural (ou via Comparator). Baseado em árvore Red-Black.
Set<Integer> numeros = new TreeSet<>();
numeros.add(30);
numeros.add(10);
numeros.add(20);
System.out.println(numeros); // [10, 20, 30]
9 – Map
Map armazena pares chave -> valor. Não permite chaves duplicadas. Implementações variam em performance e ordenação.
10 – HashMap
Implementação mais usada de Map. Não é sincronizado e não garante ordem. Chaves podem ser null.
Map<String, Integer> idades = new HashMap<>();
idades.put("Ana", 30);
idades.put("Carlos", 25);
System.out.println(idades.get("Ana")); // 30
11 – HashTable
Antigo e sincronizado, similar ao HashMap, mas não permite chave ou valor nulos. Hoje é pouco utilizado.
Hashtable<String, String> tabela = new Hashtable<>();
tabela.put("user", "admin");
tabela.put("pass", "123");
System.out.println(tabela);
12 – LinkedHasTable
Mantém os elementos na ordem de inserção. Excelente para criar caches simples.
Map<String, String> capital = new LinkedHashMap<>();
capital.put("Brasil", "Brasília");
capital.put("França", "Paris");
System.out.println(capital);
13 – TreeMap
Map ordenado pelas chaves. Baseado em árvore, assim como o TreeSet.
Map<String, Integer> ranking = new TreeMap<>();
ranking.put("Carlos", 3);
ranking.put("Ana", 1);
ranking.put("Bruno", 2);
System.out.println(ranking);
Conclusão
O Collections Framework é uma das ferramentas mais poderosas e versáteis do Java. Compreender as diferenças entre suas estruturas como listas, conjuntos e mapas, permite escolher a implementação ideal para cada cenário, aumentando a performance e a clareza do software.
Neste artigo, exploramos desde classes mais antigas como Vector e Hashtable até estruturas modernas e eficientes como ArrayList, HashMap e TreeMap. Com os exemplos apresentados, você já possui uma base sólida para utilizar coleções de forma profissional em qualquer aplicação Java.