Sobes.tech
Junior

Jaka jest różnica między interfejsami List i Set w Java?

sobes.tech AI

Odpowiedź od AI

Główne różnice między interfejsami List i Set w Javie są następujące:

  • Kolejność elementów:

    • List zachowuje kolejność dodawania elementów. Elementy mają indeksy zaczynające się od 0.
    • Set nie gwarantuje kolejności elementów. Niektóre implementacje mogą mieć określoną kolejność (np. LinkedHashSet, TreeSet), ale interfejs Set tego nie wymaga.
  • Duplikaty:

    • List pozwala na przechowywanie duplikatów.
    • Set nie pozwala na duplikaty. Próba dodania duplikatu skutkuje zignorowaniem operacji lub zwróceniem false (w zależności od implementacji i metody).
  • Wydajność:

    • Operacje dodawania i usuwania w środku List mogą być wolniejsze (zwłaszcza dla ArrayList) niż w Set.
    • Sprawdzanie, czy element istnieje (contains) w Set opartym na haszowaniu (HashSet) jest zwykle szybsze (średnio O(1)) w porównaniu do List (średnio O(n)).
    • Operacje oparte na indeksie (np. get, set) są dostępne tylko w List.
  • Implementacje:

    • Typowe implementacje List: ArrayList, LinkedList, Vector.
    • Typowe implementacje Set: HashSet, LinkedHashSet, TreeSet.

Oto przykłady ilustrujące różnice:

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 pozwala na duplikaty i zachowuje kolejność
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Dodanie duplikatu
        System.out.println("List: " + list); // Wyświetli [Apple, Banana, Apple]
        System.out.println("Element na indeksie 1: " + list.get(1)); // Dostęp po indeksie

        // Set nie pozwala na duplikaty i kolejność nie jest gwarantowana (dla HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Próba dodania duplikatu - zostanie zignorowana
        System.out.println("Set: " + set); // Wyświetli coś w stylu [Apple, Banana] lub [Banana, Apple]
        // set.get(1); // Błąd kompilacji - brak dostępu po indeksie
    }
}

Tabela porównawcza:

Cecha List Set
Kolejność Gwarantowana (kolejność dodawania) Nie gwarantowana (dla HashSet, TreeSet ma uporządkowaną kolejność)
Duplikaty Dozwolone Niedozwolone
Dostęp po indeksie Możliwy (get(int index)) Niemożliwy
Wydajność contains() O(n) średnio (dla ArrayList) O(1) średnio (dla HashSet)
Typowe implementacje ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet