Dependência entre comparadores (Comparator / Comparable) e as estruturas de dados em Java, como ArrayList, TreeSet, TreeMap e ArrayDeque.

Resumo Rápido da Relação

EstruturaPrecisa de ordenação?Usa Comparable?Aceita Comparator?Observações
ArrayList❌ NãoOpcional (para sort())✅ Sim (em Collections.sort)Ordem só se for explicitamente pedida
TreeSet✅ Sim✅ Sim✅ SimOrdena automaticamente
TreeMap✅ Sim✅ Sim✅ SimChaves são ordenadas
ArrayDeque❌ Não❌ Não❌ NãoEstrutura de fila/pilha — ordem de inserção

🔍 Vamos detalhar:


1. ArrayList

  • Não depende de ordenação.
  • É apenas uma lista dinâmica que mantém a ordem de inserção.
  • Você pode ordenar usando Collections.sort() ou list.sort():
    • Se os elementos implementarem Comparable, será usada a ordem natural (compareTo).
    • Você também pode passar um Comparator.
List<String> lista = new ArrayList<>();
lista.add("C");
lista.add("A");
lista.add("B");

// Usa compareTo de String
Collections.sort(lista); 

// Usa Comparator
Collections.sort(lista, Comparator.reverseOrder()); 

2. TreeSet

  • É um Set ordenado.
  • Depende de uma forma de ordenação:
    • Usa compareTo() (implementação de Comparable) se nada for fornecido.
    • Ou você fornece um Comparator no construtor.
  • O TreeSet não aceita elementos duplicados, com base na ordenação.
// Ordem natural
Set<Integer> treeSet = new TreeSet<>();

// Ordem reversa
Set<String> treeSet2 = new TreeSet<>(Comparator.reverseOrder());

3. TreeMap

  • É um Map ordenado pelas chaves.
  • Assim como o TreeSet, precisa que as chaves implementem Comparable, ou que você forneça um Comparator.
// Ordena pelas chaves
Map<String, Integer> mapa = new TreeMap<>();

// Ordem reversa
Map<String, Integer> mapa2 = new TreeMap<>(Comparator.reverseOrder());

Se a classe usada como chave não for comparável, ou não for fornecido um Comparator, o TreeMap lança ClassCastException na hora de inserir.


4. ArrayDeque

  • É uma estrutura de fila/pilha (deque).
  • Não depende de ordenação.
  • Não usa nem Comparable, nem Comparator.
  • A ordem de acesso é baseada na ordem de inserção e remoção (como em fila ou pilha).
Deque<String> deque = new ArrayDeque<>();
deque.add("A");
deque.add("B");
System.out.println(deque.remove()); // Remove "A" (FIFO)

🎯 Dica para a Prova (OCP/OCA):

  • TreeSet e TreeMap sempre ordenam. Logo, precisam de elementos ordenáveis (via Comparable ou Comparator).
  • ArrayList não se importa com ordenação, a menos que você chame algo como Collections.sort().
  • ArrayDeque não pode ser ordenado.

Deixe um comentário