Sobes.tech
Junior

Qual é a diferença entre as interfaces List e Set em Java?

sobes.tech IA

Resposta da IA

As principais diferenças entre as interfaces List e Set em Java são as seguintes:

  • Ordem dos elementos:

    • List mantém a ordem de inserção dos elementos. Os elementos têm índices que começam em 0.
    • Set não garante a ordem dos elementos. Algumas implementações podem ter uma ordem definida (por exemplo, LinkedHashSet, TreeSet), mas a interface Set não exige isso.
  • Duplicados:

    • List permite armazenar elementos duplicados.
    • Set não permite duplicados. Ao tentar adicionar um duplicado, a operação de adição é ignorada ou retorna false (dependendo da implementação e do método).
  • Desempenho:

    • As operações de adicionar e remover no meio de um List podem ser mais lentas (especialmente para ArrayList) do que em um Set.
    • A verificação de se um elemento existe (contains) em um Set baseado em hashing (HashSet) geralmente é mais rápida (em média O(1)) em comparação com um List (em média O(n)).
    • As operações baseadas em índice (por exemplo, get, set) estão disponíveis apenas em List.
  • Implementações:

    • Implementações típicas de List: ArrayList, LinkedList, Vector.
    • Implementações típicas de Set: HashSet, LinkedHashSet, TreeSet.

Aqui estão exemplos que demonstram as diferenças:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CollectionDifferences {

    public static void main(String[] args) {

        // List permite duplicados e mantém a ordem
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Adicionou um duplicado
        System.out.println("List: " + list); // Vai mostrar [Apple, Banana, Apple]
        System.out.println("List na posição 1: " + list.get(1)); // Acesso por índice

        // Set não permite duplicados e a ordem não é garantida (para HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Tentativa de adicionar um duplicado - será ignorada
        System.out.println("Set: " + set); // Vai mostrar algo como [Apple, Banana] ou [Banana, Apple]
        // set.get(1); // Erro de compilação - não há acesso por índice
    }
}

Tabela comparativa:

Característica List Set
Ordem Garantida (ordem de inserção) Não garantida (para HashSet, TreeSet tem ordem ordenada)
Duplicados Permitidos Não permitidos
Acesso por índice Possível (get(int index)) Impossível
Desempenho contains() O(n) em média (para ArrayList) O(1) em média (para HashSet)
Implementações típicas ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet