Sobes.tech
Junior

Qual è la differenza tra le interfacce List e Set in Java?

sobes.tech AI

Risposta dell'AI

Le principali differenze tra le interfacce List e Set in Java sono le seguenti:

  • Ordine degli elementi:

    • List mantiene l'ordine di inserimento degli elementi. Gli elementi hanno indici che partono da 0.
    • Set non garantisce l'ordine degli elementi. Alcune implementazioni possono avere un ordine definito (ad esempio, LinkedHashSet, TreeSet), ma l'interfaccia Set non lo richiede.
  • Doppioni:

    • List permette di memorizzare elementi duplicati.
    • Set non permette duplicati. Quando si tenta di aggiungere un duplicato, l'operazione di aggiunta viene ignorata o restituisce false (a seconda dell'implementazione e del metodo).
  • Prestazioni:

    • Le operazioni di aggiunta e rimozione nel mezzo di una List possono essere più lente (specialmente per ArrayList) rispetto a un Set.
    • La verifica della presenza di un elemento (contains) in un Set basato su hashing (HashSet) è generalmente più veloce (in media O(1)) rispetto a una List (in media O(n)).
    • Le operazioni basate su indice (ad esempio, get, set) sono disponibili solo in List.
  • Implementazioni:

    • Implementazioni tipiche di List: ArrayList, LinkedList, Vector.
    • Implementazioni tipiche di Set: HashSet, LinkedHashSet, TreeSet.

Ecco alcuni esempi che mostrano le differenze:

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 permette duplicati e mantiene l'ordine
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Aggiunta di un duplicato
        System.out.println("List: " + list); // Mostrerà [Apple, Banana, Apple]
        System.out.println("Elemento all'indice 1: " + list.get(1)); // Accesso tramite indice

        // Set non permette duplicati e l'ordine non è garantito (per HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Tentativo di aggiunta di un duplicato - sarà ignorato
        System.out.println("Set: " + set); // Mostrerà qualcosa come [Apple, Banana] o [Banana, Apple]
        // set.get(1); // Errore di compilazione - nessun accesso tramite indice
    }
}

Tabella comparativa:

Caratteristica List Set
Ordine Garantito (ordine di inserimento) Non garantito (per HashSet, TreeSet ha ordine ordinato)
Duplicati Permessi Non permessi
Accesso tramite indice Possibile (get(int index)) Impossibile
Performance contains() O(n) in media (per ArrayList) O(1) in media (per HashSet)
Implementazioni tipiche ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet