Sobes.tech
Junior

¿Cuál es la diferencia entre las interfaces List y Set en Java?

sobes.tech AI

Respuesta de la IA

Las principales diferencias entre las interfaces List y Set en Java son las siguientes:

  • Orden de los elementos:

    • List mantiene el orden de inserción de los elementos. Los elementos tienen índices que comienzan en 0.
    • Set no garantiza el orden de los elementos. Algunas implementaciones pueden tener un orden definido (por ejemplo, LinkedHashSet, TreeSet), pero la interfaz Set no lo requiere.
  • Duplicados:

    • List permite almacenar elementos duplicados.
    • Set no permite duplicados. Al intentar agregar un duplicado, la operación de adición se ignora o devuelve false (dependiendo de la implementación y el método).
  • Rendimiento:

    • Las operaciones de agregar y eliminar en el medio de un List pueden ser más lentas (especialmente para ArrayList) que en un Set.
    • La comprobación de si un elemento existe (contains) en un Set basado en hashing (HashSet) generalmente es más rápida (en promedio O(1)) en comparación con un List (en promedio O(n)).
    • Las operaciones basadas en índice (por ejemplo, get, set) solo están disponibles en List.
  • Implementaciones:

    • Implementaciones típicas de List: ArrayList, LinkedList, Vector.
    • Implementaciones típicas de Set: HashSet, LinkedHashSet, TreeSet.

Aquí hay ejemplos que muestran las diferencias:

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 y mantiene el orden
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Añadimos un duplicado
        System.out.println("List: " + list); // Mostrará [Apple, Banana, Apple]
        System.out.println("List en índice 1: " + list.get(1)); // Acceso por índice

        // Set no permite duplicados y el orden no está garantizado (para HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Intento de añadir un duplicado - será ignorado
        System.out.println("Set: " + set); // Mostrará algo como [Apple, Banana] o [Banana, Apple]
        // set.get(1); // Error de compilación - no hay acceso por índice
    }
}

Tabla comparativa:

Característica List Set
Orden Garantizado (orden de inserción) No garantizado (para HashSet, TreeSet tiene orden ordenado)
Duplicados Permitidos No permitidos
Acceso por índice Posible (get(int index)) Imposible
Rendimiento contains() O(n) en promedio (para ArrayList) O(1) en promedio (para HashSet)
Implementaciones típicas ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet