Sobes.tech
Junior

Mi a különbség a List és a Set interfészek között Java-ban?

sobes.tech MI

Válasz az MI-től

A Java List és Set interfészek közötti fő különbségek a következők:

  • Elemek sorrendje:

    • A List megőrzi a hozzáadás sorrendjét. Az elemek indexekkel rendelkeznek, kezdve 0-tól.
    • A Set nem garantálja az elemek sorrendjét. Néhány megvalósítás (pl. LinkedHashSet, TreeSet) bizonyos sorrendet tartalmazhat, de az Set interfész nem követeli meg.
  • Duplikátumok:

    • A List megengedi a duplikált elemek tárolását.
    • A Set nem engedélyezi a duplikált elemek tárolását. Ha duplikátumot próbál hozzáadni, az művelet vagy figyelmen kívül marad, vagy false-t ad vissza (a megvalósítástól és a metódustól függően).
  • Teljesítmény:

    • A List közepén történő hozzáadás és törlés műveletei lassabbak lehetnek (különösen az ArrayList esetében), mint a Set-nél.
    • A Set-eken belüli elem létezésének ellenőrzése (contains) általában gyorsabb (HashSet esetén átlagosan O(1)), mint a List-nél (átlagosan O(n)).
    • Az index alapú műveletek (get, set) csak a List-ben érhetők el.
  • Megvalósítások:

    • Tipikus List megvalósítások: ArrayList, LinkedList, Vector.
    • Tipikus Set megvalósítások: HashSet, LinkedHashSet, TreeSet.

Íme néhány példa, amelyek bemutatják a különbségeket:

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) {

        // A `List` duplikátumokat engedélyez és megőrzi a sorrendet
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Duplikátum hozzáadása
        System.out.println("List: " + list); // Kiírja: [Apple, Banana, Apple]
        System.out.println("List index 1-en: " + list.get(1)); // Hozzáférés index alapján

        // A `Set` nem engedélyezi a duplikátumokat, és a sorrend nem garantált (HashSet esetén)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Duplikátum hozzáadása - figyelmen kívül marad
        System.out.println("Set: " + set); // Valami ilyesmit ír ki: [Apple, Banana] vagy [Banana, Apple]
        // set.get(1); // Fordítási hiba - nincs indexelés
    }
}

Összehasonlító táblázat:

Jellemző List Set
Sorrend Garantált (hozzáadás sorrendje) Nem garantált (HashSet esetén), rendezett (TreeSet)
Duplikátumok Engedélyezett Nem engedélyezett
Hozzáférés index szerint Elérhető (get(int index)) Nem elérhető
Teljesítmény contains() Átlagosan O(n) (ArrayList) Átlagosan O(1) (HashSet)
Tipikus megvalósítások ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet