Sobes.tech
Junior

Was ist der Unterschied zwischen den Schnittstellen List und Set in Java?

sobes.tech KI

Antwort von AI

Die wichtigsten Unterschiede zwischen den Schnittstellen List und Set in Java sind die folgenden:

  • Reihenfolge der Elemente:

    • List bewahrt die Reihenfolge der Hinzufügung der Elemente. Elemente haben Indizes, die bei 0 beginnen.
    • Set garantiert die Reihenfolge der Elemente nicht. Einige Implementierungen können eine bestimmte Reihenfolge haben (z.B. LinkedHashSet, TreeSet), aber die Set-Schnittstelle fordert dies nicht.
  • Duplikate:

    • List erlaubt doppelte Elemente.
    • Set erlaubt keine Duplikate. Beim Versuch, ein Duplikat hinzuzufügen, wird die Operation ignoriert oder false zurückgegeben (je nach Implementierung und Methode).
  • Leistung:

    • Hinzufügen- und Entfernen-Operationen in der Mitte einer List können langsamer sein (besonders bei ArrayList) als in einem Set.
    • Die Überprüfung, ob ein Element vorhanden ist (contains) in einem auf Hashing (HashSet) basierenden Set ist in der Regel schneller (durchschnittlich O(1)) im Vergleich zu einer List (durchschnittlich O(n)).
    • Indexbasierte Operationen (get, set) sind nur in List verfügbar.
  • Implementierungen:

    • Typische List-Implementierungen: ArrayList, LinkedList, Vector.
    • Typische Set-Implementierungen: HashSet, LinkedHashSet, TreeSet.

Hier sind Beispiele, die die Unterschiede demonstrieren:

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 erlaubt Duplikate und bewahrt die Reihenfolge
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Doppelte hinzufügen
        System.out.println("List: " + list); // Zeigt [Apple, Banana, Apple]
        System.out.println("List bei Index 1: " + list.get(1)); // Zugriff per Index

        // Set erlaubt keine Duplikate und die Reihenfolge ist nicht garantiert (bei HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Versuch, ein Duplikat hinzuzufügen - wird ignoriert
        System.out.println("Set: " + set); // Zeigt etwas wie [Apple, Banana] oder [Banana, Apple]
        // set.get(1); // Kompilierungsfehler - kein Zugriff per Index
    }
}

Vergleichstabelle:

Merkmal List Set
Reihenfolge Garantiert (Einfügereihenfolge) Nicht garantiert (bei HashSet, TreeSet hat sortierte Reihenfolge)
Duplikate Erlaubt Nicht erlaubt
Zugriff per Index Möglich (get(int index)) Nicht möglich
Leistung contains() O(n) im Durchschnitt (bei ArrayList) O(1) im Durchschnitt (bei HashSet)
Typische Implementierungen ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet