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:
Listmantém a ordem de inserção dos elementos. Os elementos têm índices que começam em 0.Setnão garante a ordem dos elementos. Algumas implementações podem ter uma ordem definida (por exemplo,LinkedHashSet,TreeSet), mas a interfaceSetnão exige isso.
-
Duplicados:
Listpermite armazenar elementos duplicados.Setnão permite duplicados. Ao tentar adicionar um duplicado, a operação de adição é ignorada ou retornafalse(dependendo da implementação e do método).
-
Desempenho:
- As operações de adicionar e remover no meio de um
Listpodem ser mais lentas (especialmente paraArrayList) do que em umSet. - A verificação de se um elemento existe (
contains) em umSetbaseado em hashing (HashSet) geralmente é mais rápida (em média O(1)) em comparação com umList(em média O(n)). - As operações baseadas em índice (por exemplo,
get,set) estão disponíveis apenas emList.
- As operações de adicionar e remover no meio de um
-
Implementações:
- Implementações típicas de
List:ArrayList,LinkedList,Vector. - Implementações típicas de
Set:HashSet,LinkedHashSet,TreeSet.
- Implementações típicas de
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 |