Sobes.tech
Junior

Aký je rozdiel medzi rozhraniami List a Set v Jave?

sobes.tech AI

Odpoveď od AI

Hlavné rozdiely medzi rozhraniami List a Set v Jave sú:

  • Poradie prvkov:

    • List zachováva poradie pridania prvkov. Prvky majú indexy začínajúce od 0.
    • Set nezaručuje poradie prvkov. Niektoré implementácie (napríklad LinkedHashSet, TreeSet) môžu mať určité poradie, ale rozhranie Set to nevyžaduje.
  • Duplikáty:

    • List umožňuje uloženie duplicitných prvkov.
    • Set neumožňuje uloženie duplicitných prvkov. Pri pokuse o pridanie duplicitného prvku je operácia buď ignorovaná, alebo vracia false (závisí od implementácie a metódy).
  • Výkon:

    • Operácie pridania a odstránenia uprostred List môžu byť pomalšie (najmä u ArrayList) než u Set.
    • Kontrola existencie prvku (contains) v Set, založenom na hashovaní (HashSet), je zvyčajne rýchlejšia (priemerne O(1)) v porovnaní s List (priemerne O(n)).
    • Operácie založené na indexe (get, set) sú dostupné iba v List.
  • Implementácie:

    • Typické implementácie List: ArrayList, LinkedList, Vector.
    • Typické implementácie Set: HashSet, LinkedHashSet, TreeSet.

Tu sú príklady, ktoré ukazujú rozdiely:

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áva poradie
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Pridanie duplicitného prvku
        System.out.println("List: " + list); // Vypíše [Apple, Banana, Apple]
        System.out.println("Prvok na indexe 1: " + list.get(1)); // Prístup podľa indexu

        // Set neumožňuje duplicitné prvky a poradie nie je garantované (pre HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Pokus o pridanie duplicitného prvku - bude ignorované
        System.out.println("Set: " + set); // Vypíše niečo ako [Apple, Banana] alebo [Banana, Apple]
        // set.get(1); // Chyba kompilácie - nie je prístup podľa indexu
    }
}

Porovnávacia tabuľka:

Charakteristika List Set
Poradie Garantované (poradie pridania) Nie garantované (pre HashSet), zoradené (TreeSet)
Duplicitáty Povolené Nepovolené
Prístup podľa indexu Možný (get(int index)) Nie je možný
Výkon contains() O(n) priemerne (pre ArrayList) O(1) priemerne (pre HashSet)
Typické implementácie ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet