Sobes.tech
Junior

Jaký je rozdíl mezi rozhraními List a Set v jazyce Java?

sobes.tech AI

Odpověď od AI

Hlavní rozdíly mezi rozhraními List a Set v Javě jsou:

  • Pořadí prvků:

    • List zachovává pořadí přidání prvků. Prvky mají indexy začínající od 0.
    • Set nezaručuje pořadí prvků. Některé implementace (například LinkedHashSet, TreeSet) mohou mít určité pořadí, ale rozhraní Set to nevyžaduje.
  • Duplikáty:

    • List umožňuje ukládání duplicitních prvků.
    • Set neumožňuje ukládání duplicitních prvků. Při pokusu o přidání duplicitního prvku je operace buď ignorována, nebo vrací false (závisí na implementaci a metodě).
  • Výkon:

    • Operace přidání a odstranění uprostřed List mohou být pomalejší (zejména u ArrayList) než u Set.
    • Kontrola existence prvku (contains) v Set založeném na hashování (HashSet) je obvykle rychlejší (průměrně O(1)) ve srovnání s List (průměrně O(n)).
    • Operace založené na indexu (get, set) jsou dostupné pouze v List.
  • Implementace:

    • Typické implementace List: ArrayList, LinkedList, Vector.
    • Typické implementace Set: HashSet, LinkedHashSet, TreeSet.

Zde jsou příklady, které ukazují rozdíly:

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 umožňuje duplicitní prvky a zachovává pořadí
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Přidání duplicitního prvku
        System.out.println("List: " + list); // Vypíše [Apple, Banana, Apple]
        System.out.println("Prvek na indexu 1: " + list.get(1)); // Přístup podle indexu

        // Set neumožňuje duplicitní prvky a pořadí není garantováno (pro HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Pokus o přidání duplicitního prvku - bude ignorováno
        System.out.println("Set: " + set); // Vypíše něco jako [Apple, Banana] nebo [Banana, Apple]
        // set.get(1); // Chyba kompilace - není přístup podle indexu
    }
}

Porovnávací tabulka:

Charakteristika List Set
Pořadí Garantované (pořadí přidání) Není garantované (pro HashSet), řazené (TreeSet)
Duplikáty Povolené Nepovolené
Přístup podle indexu Možný (get(int index)) Není možný
Výkon contains() O(n) průměrně (pro ArrayList) O(1) průměrně (pro HashSet)
Typické implementace ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet