Collections Java
- #Java
As collections em Java são estruturas de dados que permitem armazenar, acessar e manipular grupos de objetos de forma eficiente. Elas fazem parte do framework de collections do Java, que oferece várias interfaces e classes para trabalhar com conjuntos de dados de maneira flexível e poderosa. Vou te explicar os principais conceitos e as principais interfaces e classes que compõem o framework de collections em Java.
Principais Interfaces do Framework de Collections:
Collection: É a interface raiz de todas as coleções. Ela define métodos básicos como add(), remove(), size(), isEmpty(), e contains(). No entanto, você não pode instanciar uma Collection diretamente; em vez disso, você usa uma das suas subinterfaces.
List: Uma List é uma coleção ordenada que permite elementos duplicados. Cada elemento tem um índice associado, começando em zero.
Implementações comuns:
ArrayList: Baseada em um array dinâmico, permite acesso rápido aos elementos, porém é lenta para inserções e remoções no meio da lista.
LinkedList: Baseada em uma lista duplamente encadeada, é mais rápida para inserções e remoções, mas o acesso aos elementos é mais lento em comparação com ArrayList.
Set: Um Set é uma coleção que não permite elementos duplicados. A ordem dos elementos pode não ser garantida.
Implementações comuns:
HashSet: Implementado com uma tabela hash, oferece desempenho constante para operações básicas.
- Muito comum seu uso, ao não ter prioridade para manter ordem dos elementos ao ser inseridos.
LinkedHashSet: Como HashSet, mas mantém a ordem de inserção dos elementos.
TreeSet: Implementado como uma árvore de busca binária (árvore rubro-negra), mantém os elementos ordenados e oferece operações básicas com tempo logarítmico.
- Árvore rubro-negra: tipo avançado de árvore binária de busca, possui características especiais para garantir que a árvore permaneça balanceada.
Queue: Uma Queue (fila) é uma coleção que mantém a ordem de inserção dos elementos e segue a regra FIFO (First-In-First-Out), onde o primeiro elemento a entrar é o primeiro a sair.
Implementações comuns:
LinkedList: Também pode ser usada como uma fila.
PriorityQueue: Uma fila que ordena os elementos conforme a ordem natural ou por meio de um comparador.
Map: Um Map mapeia chaves para valores, ou seja, é uma coleção de pares chave-valor. Uma chave única está associada a um valor.
Implementações comuns:
HashMap: Implementado com uma tabela hash, oferece desempenho constante para operações básicas, mas não garante a ordem dos elementos.
Exemplo:
HashMap<String, Integer> hashMap = new HashMap<>();
hashMap.put("Banana", 5);
hashMap.put("Maça", 10);
hashMap.put("Laranja", 7);
LinkedHashMap: Mantém a ordem de inserção dos pares chave-valor.
TreeMap: Implementado como uma árvore de busca binária (árvore rubro-negra), mantém as chaves ordenadas e oferece operações básicas com tempo logarítmico.
Exemplo:
TreeMap<String, Integer> treeMap = new HashMap<>();
treeMap.put("Banana", 5);
treeMap.put("Maça", 10);
treeMap.put("Laranja", 7);
- Obs.: aqui mantém ordenação dos elementos, onde será exibido em ordem alfabética.
Como Escolher a Coleção Adequada
- Se você precisa de uma lista ordenada com acesso rápido por índice, use ArrayList.
- Se você precisa de uma lista onde inserções e remoções rápidas no início e meio são importantes, use LinkedList.
- Se você precisa garantir que não haja duplicatas e a ordem não importa, use HashSet.
- Se você precisa de um conjunto que mantém a ordem de inserção, use LinkedHashSet.
- Se você precisa de um conjunto ordenado, use TreeSet.
- Se você precisa de um mapeamento chave-valor sem ordem específica, use HashMap.
- Se você precisa de um mapeamento chave-valor com a ordem de inserção garantida, use LinkedHashMap.
- Se você precisa de um mapeamento chave-valor ordenado pelas chaves, use TreeMap.
Conclusão:
As coleções em Java são extremamente poderosas e flexíveis, oferecendo diferentes opções para armazenar e manipular dados conforme as necessidades da aplicação. Conhecer as características e diferenças entre List, Set, Queue, e Map é essencial para escolher a estrutura de dados correta para cada situação.