Collection Set
HashSet, TreeSet e unicidade
Set é uma interface que representa uma coleção sem elementos duplicados. As implementações principais são HashSet (sem ordem definida, operações O(1) em média), LinkedHashSet (mantém a ordem de inserção, O(1)) e TreeSet (ordenado naturalmente ou por Comparator, operações O(log n)).
A garantia de unicidade é o diferencial: quando você tenta adicionar um elemento que já existe, o add() retorna false e a coleção não muda. Isso torna Set ideal para eliminar duplicatas, verificar pertencimento eficientemente e realizar operações de conjuntos (união, interseção, diferença).
Para que HashSet funcione corretamente com classes personalizadas, você precisa sobrescrever equals() e hashCode(). O TreeSet exige que o tipo implemente Comparable ou que você forneça um Comparator.
import java.util.*;
// ── HashSet: sem duplicatas, sem ordem garantida ──
Set<String> cidades = new HashSet<>();
cidades.add("São Paulo");
cidades.add("Rio de Janeiro");
cidades.add("São Paulo"); // ← ignorado! já existe
cidades.add("Brasília");
System.out.println(cidades.size()); // 3
System.out.println(cidades.contains("Brasília")); // true
// ── TreeSet: ordenado automaticamente ────────────
Set<Integer> numeros = new TreeSet<>();
numeros.addAll(Arrays.asList(5, 3, 8, 1, 5, 3));
System.out.println(numeros); // [1, 3, 5, 8]
// ── Eliminar duplicatas de uma lista ─────────────
List<String> comDup = Arrays.asList("a", "b", "a", "c", "b", "a");
Set<String> semDup = new LinkedHashSet<>(comDup); // mantém ordem
System.out.println(semDup); // [a, b, c]
// ── Operações de conjuntos ────────────────────────
Set<Integer> a = new HashSet<>(Set.of(1, 2, 3, 4));
Set<Integer> b = new HashSet<>(Set.of(3, 4, 5, 6));
a.retainAll(b); // interseção: a = {3, 4}
// a.addAll(b) // união
// a.removeAll(b) // diferençaUse Set.of(1, 2, 3) (Java 9+) para criar sets imutáveis de forma concisa. Para sets mutáveis inicializados, envolva com new HashSet<>(Set.of(...)).