Introdução às Coleções em Java: List e Set

Por Gaspar Barancelli Junior em 04 de abril de 2024

Collection em Java é um framework que fornece uma estrutura unificada para armazenar e manipular grupos de objetos. A interface Collection é o ponto de entrada para o framework Collection e define o conjunto de operações que podem ser realizadas em uma coleção, como adicionar, remover e verificar a existência de elementos.

Existem duas interfaces tipadas importantes que estendem a interface Collection em Java: List e Set. Essas interfaces estendem a interface Collection e adicionam comportamentos adicionais que são específicos para suas implementações.

A interface List define uma coleção ordenada de elementos, permitindo o acesso aos elementos por meio de um índice. Ela fornece métodos para adicionar, remover e substituir elementos em qualquer posição da lista. A implementação mais comum da interface List é o ArrayList.

A interface Set define uma coleção que não permite elementos duplicados. Ela fornece métodos para adicionar, remover e verificar a existência de elementos na coleção. A implementação mais comum da interface Set é o HashSet.

As interfaces tipadas List e Set são genéricas, o que significa que elas podem ser parametrizadas com um tipo específico de objeto que a coleção irá armazenar. Isso permite que o compilador verifique o tipo correto de objeto que está sendo adicionado à coleção, evitando erros em tempo de execução. Por exemplo, a declaração de uma lista de strings seria:

Implementações

Existem várias implementações concretas para cada interface, cada uma adequada a diferentes necessidades e requisitos de desempenho.

List
  • ArrayList: implementação padrão de List em Java. Armazena elementos em um array dinâmico, permitindo acesso rápido aos elementos pelo índice. Não garante a ordem dos elementos.

  • LinkedList: implementação de List que armazena elementos em uma lista encadeada. É eficiente para inserção e remoção de elementos em qualquer posição da lista.

  • Vector: implementação antiga de List em Java. É semelhante a um ArrayList, mas é sincronizado, tornando-o adequado para uso em ambientes com várias threads.

  • Stack: implementação de List que estende a classe Vector e fornece funcionalidade adicional para empilhar e desempilhar elementos.

Set
  • HashSet: implementação padrão de Set em Java. Armazena elementos em uma tabela hash, permitindo acesso rápido aos elementos. Não garante a ordem dos elementos.

  • TreeSet: implementação de Set que mantém os elementos ordenados de acordo com a ordem natural dos elementos ou com um Comparator fornecido pelo usuário.

  • LinkedHashSet: implementação de Set que mantém a ordem de inserção dos elementos.

  • EnumSet: implementação de Set otimizada para uso com elementos do tipo Enum.

  • CopyOnWriteArraySet: implementação de Set que usa um array para armazenar os elementos e cria uma cópia do array sempre que um elemento é adicionado, removido ou atualizado. É projetado para ser usado em situações de concorrência.

Exemplo de utilização das coleções em Java
ArrayList
import java.util.ArrayList;
import java.util.List;

public class ExemploArrayList {
   public static void main(String[] args) {
      // Criando um ArrayList
      List<String> lista = new ArrayList<>();

      // Adicionando elementos à lista
      lista.add("Elemento 1");
      lista.add("Elemento 2");
      lista.add("Elemento 3");
      lista.add("Elemento 4");

      // Imprimindo o tamanho da lista
      System.out.println("Tamanho da lista: " + lista.size());

      // Acessando um elemento da lista
      String elemento = lista.get(1);
      System.out.println("O elemento da posição 1 é: " + elemento);

      // Removendo um elemento da lista
      lista.remove(2);

      // Imprimindo o tamanho da lista novamente
      System.out.println("Tamanho da lista após a remoção: " + lista.size());

      // Iterando sobre a lista
      for (String elem : lista) {
         System.out.println(elem);
      }
   }
}

Neste exemplo, criamos um ArrayList de strings e adicionamos alguns elementos a ele. Em seguida, imprimimos o tamanho da lista, acessamos um elemento específico pelo seu índice, removemos um elemento e imprimimos o tamanho da lista novamente. Por fim, usamos um loop for-each para iterar sobre a lista e imprimir cada elemento.

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

public class ExemploHashSet {
   public static void main(String[] args) {
      // Criando um HashSet
      Set<String> conjunto = new HashSet<>();

      // Adicionando elementos ao conjunto
      conjunto.add("Elemento 1");
      conjunto.add("Elemento 2");
      conjunto.add("Elemento 3");
      conjunto.add("Elemento 4");

      // Imprimindo o tamanho do conjunto
      System.out.println("Tamanho do conjunto: " + conjunto.size());

      // Verificando se um elemento está no conjunto
      System.out.println("O conjunto contém o elemento 'Elemento 1'? " + conjunto.contains("Elemento 1"));

      // Removendo um elemento do conjunto
      conjunto.remove("Elemento 3");

      // Imprimindo o tamanho do conjunto novamente
      System.out.println("Tamanho do conjunto após a remoção: " + conjunto.size());

      // Iterando sobre o conjunto
      for (String elemento : conjunto) {
         System.out.println(elemento);
      }
   }
}

Neste exemplo, criamos um HashSet de strings e adicionamos alguns elementos a ele. Em seguida, imprimimos o tamanho do conjunto, verificamos se ele contém um determinado elemento, removemos um elemento e imprimimos o tamanho do conjunto novamente. Por fim, usamos um loop for-each para iterar sobre o conjunto e imprimir cada elemento.

Conclusão

As Collections em Java são uma parte importante da linguagem e fornecem uma estrutura poderosa para armazenar e manipular dados. As interfaces e classes permitem que os desenvolvedores trabalhem com diferentes tipos de coleções, incluindo listas e conjuntos. Com este conhecimento, você pode começar a usar as coleções Java em seus próprios projetos e tirar proveito de sua eficiência e flexibilidade.

// Compartilhe esse Post