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 comComparable/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 (
ArrayListO(1)) vs inserção/remoção nas pontas (LinkedList). - HashMap, TreeMap, LinkedHashMap — sem ordem garantida vs ordem natural/
Comparatorvs 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 — devolvemfalse/null). - Iterator e Iterable — percorrer coleções; comportamento fail-fast (iteradores de
ArrayList,HashMap) vs fail-safe (coleções concorrentes, ex.CopyOnWriteArrayList). - Comparable e Comparator —
compareTo(ordem natural, dentro da classe) vsComparator(ordem externa);Comparator.comparing,thenComparing(desempate),reversed. - Collections.sort e imutabilidade —
List.of,Collections.unmodifiableListe 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:
- Arrays e varargs (G1)
- O Collections Framework (G2)
- Listas, conjuntos e filas (G2)
- Mapas (G2)
- Comparable e Comparator (G2)
- SequencedCollection e SequencedMap (G2)
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); // 💥 UnsupportedOperationException2. 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 congelada3. 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 segura5. 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
unmodifiableListis a read-only view over the backing list — changes to the original still show through it.List.copyOfgives you a true defensive copy. And remember thatArrayList’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