Sobes.tech
Junior

Que tipos de coleções existem em Java?

sobes.tech IA

Resposta da IA

Em Java, os principais tipos de coleções são apresentados no Framework de Coleções J2SE e dividem-se em três categorias principais:

  1. Set:
    • Coleções não ordenadas que não contêm duplicados.
    • Implementações: HashSet, LinkedHashSet, TreeSet.
  2. List:
    • Coleções ordenadas cujos elementos são acessíveis por índice. Podem conter duplicados.
    • Implementações: ArrayList, LinkedList, Vector, Stack.
  3. Map:
    • Armazenam pares "chave-valor". As chaves são únicas, os valores não. Os elementos são armazenados sem uma ordem específica (exceto LinkedHashMap e TreeMap).
    • Implementações: HashMap, LinkedHashMap, TreeMap, Hashtable.

Para além destas interfaces principais (Set, List, Map), existem também outras menos comuns:

  • Queue: Coleção concebida para manter elementos até ao seu processamento. Geralmente funciona sob o princípio FIFO (primeiro a entrar, primeiro a sair).
    • Implementações: PriorityQueue, ArrayDeque, LinkedList.
  • Deque: Fila de duas extremidades que suporta inserções e remoções em ambos os lados.
    • Implementações: ArrayDeque, LinkedList.

A classe abstrata Collection é a interface raiz para a maioria da hierarquia de coleções (Set, List, Queue). Map não implementa Collection.

Exemplos de uso:

// ArrayList
ArrayList<String> list = new ArrayList<>();
list.add("Apple");
list.add("Banana");
list.add("Apple"); // Duplicado permitido

// HashSet
HashSet<String> set = new HashSet<>();
set.add("Apple");
set.add("Banana");
set.add("Apple"); // Ignorado, pois duplicados não são permitidos

// HashMap
HashMap<String, Integer> map = new HashMap<>();
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Orange", 1); // Os valores podem ser iguais

A escolha de uma implementação específica depende das características necessárias: necessidade de manter a ordem, permissão de duplicados, velocidade de acesso e inserção, multithreading, etc. Por exemplo, ArrayList é conveniente para acesso rápido por índice, LinkedList para inserções/remoções frequentes no meio, HashSet para busca rápida de elementos únicos, e HashMap para armazenar dados por chave. Vector e Hashtable são implementações sincronizadas (thread-safe), mas geralmente é preferível usar versões não sincronizadas (ArrayList, HashMap) e gerir a sincronização noutro nível, ou usar coleções do pacote java.util.concurrent. LinkedHashSet e LinkedHashMap mantêm a ordem de inserção. TreeSet e TreeMap armazenam elementos em ordem ordenada. ArrayDeque é frequentemente preferido ao Stack e LinkedList ao usar como pilha ou fila devido ao melhor desempenho. PriorityQueue organiza os elementos de acordo com a sua ordem natural ou usando um Comparator.