Aprenda tudo sobre Collections no Java

O Java possui diversas formas de trabalhar com listas e isso sempre gera duvidas de qual melhor momentos para usar uma ou outra, descubra hoje qual melhor usar!

🌟 Introdução às Collections no Java

Collections no Java são uma parte essencial do framework e são utilizadas para armazenar, manipular e organizar os dados. Existem várias classes e interfaces que fazem parte do pacote java.util e cada uma delas tem um propósito específico.

🔥 Tipos de Collections no Java

As Collections no Java podem ser divididas em três categorias principais:

1️⃣ List: Uma coleção ordenada de elementos que permite duplicatas.
Exemplos: ArrayList, LinkedList

2️⃣ Set: Uma coleção não ordenada de elementos únicos, ou seja, não permite duplicatas.
Exemplos: HashSet, TreeSet, LinkedHashSet

3️⃣ Map: Uma coleção que armazena pares de chave-valor e permite recuperar um valor com base em sua chave.
Exemplos: HashMap, TreeMap, LinkedHashMap

✨ Para que serve cada tipo de Collection?

1️⃣ List: Ideal para quando você precisa manter a ordem dos elementos e permitir duplicatas. É útil para armazenar itens em sequência ou quando a posição de um elemento é importante.

2️⃣ Set: Ideal para armazenar elementos únicos e quando a ordem dos elementos não é relevante. É útil para eliminar duplicatas e garantir que cada elemento ocorra apenas uma vez na coleção.

3️⃣ Map: Ideal para armazenar pares de chave-valor e quando você precisa recuperar um valor com base em sua chave. É útil para armazenar dados relacionais, como dicionários ou listas de associações.

🔧 Melhores momentos para usar cada tipo de Collection

1️⃣ List: Utilize quando a ordem dos elementos é importante e duplicatas são permitidas.
Exemplo: Armazenar uma lista de nomes de alunos em uma turma.

2️⃣ Set: Utilize quando você deseja armazenar elementos únicos e a ordem não é importante.
Exemplo: Armazenar uma lista de IDs únicos de usuários.

3️⃣ Map: Utilize quando você precisa armazenar pares de chave-valor e recuperar valores com base em chaves.
Exemplo: Armazenar informações de contato com base no nome do usuário.

⭐ Melhores práticas para usar Collections

Use interfaces em vez de implementações ao declarar coleções.
Utilize o operador diamante ao criar instâncias de coleções.
Evite a modificação de coleções durante a iteração.
Utilize o método forEach() para iterar quando possível.
Palavras Chaves calda longa:
Coleções Java, List no Java, Set no Java, Map no Java, Melhores práticas Collections

 

Exemplos

Aqui estão três exemplos de como percorrer uma lista de objetos Aluno e adicionar +1 às notas usando diferentes Collections em Java. Vou explicar cada exemplo e discutir a melhor abordagem.

Usando ArrayList:

 



import java.util.ArrayList;
import java.util.List;

 

class Aluno {
    String nome;
    int nota;

 

    Aluno(String nome, int nota) {
        this.nome = nome;
        this.nota = nota;
    }
}

 

public class Main {
    public static void main(String[] args) {
        List<Aluno> alunos = new ArrayList<>();
        alunos.add(new Aluno("João", 5));
        alunos.add(new Aluno("Maria", 8));

 

        for (Aluno aluno : alunos) {
            aluno.nota += 1;
            System.out.println("Nome: " + aluno.nome + " | Nota: " + aluno.nota);
        }
    }
}

 

Neste exemplo, estamos usando um ArrayList, que é uma implementação de List. A vantagem do ArrayList é que ele permite acesso rápido aos elementos e é a opção mais simples para armazenar uma lista ordenada de objetos.

Usando LinkedList:

 



import java.util.LinkedList;
import java.util.List;

 

// ... (Classe Aluno)

 

public class Main {
    public static void main(String[] args) {
        List<Aluno> alunos = new LinkedList<>();
        alunos.add(new Aluno("João", 5));
        alunos.add(new Aluno("Maria", 8));

 

        for (Aluno aluno : alunos) {
            aluno.nota += 1;
            System.out.println("Nome: " + aluno.nome + " | Nota: " + aluno.nota);
        }
    }
}

 

Aqui, estamos usando um LinkedList, outra implementação de List. LinkedList é uma boa opção quando há muitas operações de inserção e remoção de elementos, pois é mais rápido do que o ArrayList nessas operações. No entanto, o acesso aos elementos é mais lento.

Usando HashSet:

 



import java.util.HashSet;
import java.util.Set;

 

// ... (Classe Aluno)

 

public class Main {
    public static void main(String[] args) {
        Set<Aluno> alunos = new HashSet<>();
        alunos.add(new Aluno("João", 5));
        alunos.add(new Aluno("Maria", 8));

 

        for (Aluno aluno : alunos) {
            aluno.nota += 1;
            System.out.println("Nome: " + aluno.nome + " | Nota: " + aluno.nota);
        }
    }
}

 

Neste exemplo, estamos usando um HashSet, que é uma implementação de Set. Um Set não permite elementos duplicados e não mantém a ordem dos elementos. No entanto, a busca por elementos é muito rápida.

Conclusão:

Neste caso específico, como estamos apenas percorrendo a lista e incrementando as notas, a melhor opção é usar o ArrayList. Ele fornece acesso rápido aos elementos e é a implementação mais simples e eficiente para essa tarefa.

Se houvesse muitas operações de inserção e remoção, o LinkedList seria uma escolha melhor. E se fosse necessário garantir que não houvesse elementos duplicados e a busca por elementos fosse crucial, o HashSet seria a melhor opção.