Domínio 5 — Arrays e coleções

TL;DR

Este é o domínio das estruturas de dados na OCP. A Oracle quer que você conheça arrays (declaração, multi-dimensão, Arrays.toString/sort/binarySearch) e o Collections Framework inteiro: List/Set/Map/Queue, suas implementações, ordenação com Comparable/Comparator, imutabilidade (view vs cópia) e as novidades sequenced do Java 21. As pegadinhas aqui são quase todas sobre o que a coleção faz quando você tenta mexer nela — tamanho fixo, view que reflete a original, ConcurrentModificationException.

Títulos oficiais

  • 1Z0-830 (Java 21): Working with Arrays and Collections
  • 1Z0-831 (Java 25): Using Arrays and Collections to Store and Retrieve Data

O que a Oracle cobra

  • Arrays — declaração, inicialização, arrays multi-dimensionais (e “jagged”), Arrays.toString, Arrays.sort, Arrays.binarySearch (exige array já ordenado, senão resultado é indefinido).
  • List, Set, Map, Queue — as quatro interfaces-base e suas implementações; características de cada uma (ordenação, duplicatas, nulos).
  • ArrayList vs LinkedList — trade-offs de acesso aleatório (ArrayList O(1)) vs inserção/remoção nas pontas (LinkedList).
  • HashMap, TreeMap, LinkedHashMap — sem ordem garantida vs ordem natural/Comparator vs ordem de inserção.
  • HashSet, TreeSet, LinkedHashSet — os mesmos contratos de ordenação aplicados a Set.
  • Deque, Stack, Queue — operações e em qual ponta elas atuam: push/pop/peek (pilha, topo), offer/poll (fila, sem exceção em fila vazia — devolvem false/null).
  • Iterator e Iterable — percorrer coleções; comportamento fail-fast (iteradores de ArrayList, HashMap) vs fail-safe (coleções concorrentes, ex. CopyOnWriteArrayList).
  • Comparable e ComparatorcompareTo (ordem natural, dentro da classe) vs Comparator (ordem externa); Comparator.comparing, thenComparing (desempate), reversed.
  • Collections.sort e imutabilidade — List.of, Collections.unmodifiableList e a distinção crítica entre view vs cópia.
  • ConcurrentModificationException — o que dispara e como evitar.
  • SequencedCollection / SequencedSet / SequencedMap (Java 21) — getFirst() / getLast() / addFirst / addLast / reversed().

Mapa de revisão

A trilha de Collections (Galho 2) já cobre tudo isto em profundidade — aqui vão os pontos exatos de revisão:

Pegadinhas deste domínio

Este domínio é uma mina de armadilhas. A prova adora um snippet curto que parece inocente e estoura em runtime. As cinco mais cobradas:

1. Arrays.asList(arr) retorna lista de TAMANHO FIXO. Não é uma ArrayList “de verdade”. Você pode set() em índice existente, mas .add() ou .remove() lançam UnsupportedOperationException.

List<Integer> lista = Arrays.asList(1, 2, 3);
lista.set(0, 99); // OK — tamanho não muda
lista.add(4);     // 💥 UnsupportedOperationException

2. View vs cópia. Collections.unmodifiableList(original) é uma VIEW: você não pode escrever por ela, mas se a lista original mudar, a view reflete a mudança. Já List.copyOf(original) e List.of(...) produzem cópias independentes e imutáveis.

List<String> orig = new ArrayList<>(List.of("a"));
List<String> view = Collections.unmodifiableList(orig);
List<String> copia = List.copyOf(orig);
orig.add("b");
view.size();  // 2 — a view enxerga a mudança
copia.size(); // 1 — a cópia ficou congelada

3. Valores default de arrays. Ao alocar um array, os elementos recebem o default do tipo — não ficam “vazios”:

int[]     a = new int[3];     // [0, 0, 0]
Integer[] b = new Integer[3]; // [null, null, null]  ← wrapper, não primitivo
boolean[] c = new boolean[3]; // [false, false, false]

4. ConcurrentModificationException no for-each. Modificar a coleção (add/remove) enquanto a percorre com for-each (que usa o Iterator fail-fast por baixo) dispara a exceção. Use Iterator.remove() ou removeIf().

for (String s : lista) {
    if (s.equals("x")) lista.remove(s); // 💥 ConcurrentModificationException
}
lista.removeIf(s -> s.equals("x"));     // ✅ forma segura

5. equals/hashCode quebrados. Se você usa um objeto como chave de HashMap ou elemento de HashSet sem sobrescrever hashCode() (ou sobrescrever equals mas não hashCode), a coleção “perde” o objeto: você guarda e depois não consegue mais recuperá-lo, porque a busca cai em outro bucket.

Catálogo completo

Essas e mais armadilhas estão consolidadas no catálogo de pegadinhas do galho.

Em entrevista

Falar com clareza sobre imutabilidade pega bem em qualquer entrevista — sem precisar reivindicar a certificação:

“An unmodifiableList is a read-only view over the backing list — changes to the original still show through it. List.copyOf gives you a true defensive copy. And remember that ArrayList’s iterator is fail-fast: it throws if the collection is structurally modified mid-iteration.”

Vocabulário PT | EN:

  • coleção imutável → immutable collection
  • visão → view
  • tamanho fixo → fixed-size
  • ordem de inserção → insertion order
  • desempate (no thenComparing) → tie-breaker

Veja também

Referências