Sobes.tech
Junior

Care este diferența dintre interfețele List și Set în Java?

sobes.tech AI

Răspuns de la AI

Principalele diferențe dintre interfețele List și Set în Java sunt următoarele:

  • Ordinea elementelor:

    • List păstrează ordinea de inserare a elementelor. Elementele au indici care încep de la 0.
    • Set nu garantează ordinea elementelor. Unele implementări pot avea o anumită ordine (de exemplu, LinkedHashSet, TreeSet), dar interfața Set nu o cere.
  • Dubluri:

    • List permite stocarea elementelor duplicate.
    • Set nu permite duplicate. La încercarea de a adăuga un duplicat, operația fie este ignorată, fie returnează false (în funcție de implementare și metodă).
  • Performanță:

    • Operațiile de adăugare și ștergere în mijlocul unui List pot fi mai lente (mai ales pentru ArrayList) decât în cazul unui Set.
    • Verificarea dacă un element există (contains) într-un Set bazat pe hashing (HashSet) este de obicei mai rapidă (în medie O(1)) comparativ cu un List (în medie O(n)).
    • Operațiile bazate pe index (get, set) sunt disponibile doar în List.
  • Implementări:

    • Implementări tipice de List: ArrayList, LinkedList, Vector.
    • Implementări tipice de Set: HashSet, LinkedHashSet, TreeSet.

Iată exemple care ilustrează diferențele:

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 duplicate și păstrează ordinea
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Adăugăm un duplicat
        System.out.println("List: " + list); // Va afișa [Apple, Banana, Apple]
        System.out.println("Element la indexul 1: " + list.get(1)); // Accesare după index

        // Set nu permite duplicate și ordinea nu este garantată (pentru HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Încercare de adăugare a unui duplicat - va fi ignorată
        System.out.println("Set: " + set); // Va afișa ceva de genul [Apple, Banana] sau [Banana, Apple]
        // set.get(1); // Eroare de compilare - nu există acces după index
    }
}

Tabel comparativ:

Caracteristică List Set
Ordine Garantată (ordine de inserare) Nu garantată (pentru HashSet, TreeSet are ordine sortată)
Duplicate Permis Interzis
Acces după index Posibil (get(int index)) Imposibil
Performanță contains() O(n) în medie (pentru ArrayList) O(1) în medie (pentru HashSet)
Implementări tipice ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet