Sobes.tech
Junior

Kuo skiriasi sąsajos List ir Set Java?

sobes.tech AI

Atsakymas iš AI

Pagrindiniai skirtumai tarp List ir Set sąsajų Java kalboje yra šie:

  • Elementų tvarka:

    • List išsaugo pridėjimo tvarką. Elementai turi indeksus, pradedant nuo 0.
    • Set ne garantuoja elementų tvarką. Kai kurios įgyvendinimo formos (pvz., LinkedHashSet, TreeSet) gali turėti tam tikrą tvarką, bet Set sąsaja to nereikalauja.
  • Dublikatai:

    • List leidžia saugoti dubliuojamus elementus.
    • Set neleidžia saugoti dubliuojamų elementų. Bandant pridėti dubliuojamą elementą, operacija arba ignoruojama, arba grąžinama false (priklausomai nuo įgyvendinimo ir metodo).
  • Našumas:

    • Operacijos pridėjimas ir ištrynimas List viduryje gali būti lėtesnės (ypač ArrayList), nei Set.
    • Patikrinimas ar elementas yra (contains) Set, pagrįstas maišavimu (HashSet), dažniausiai vykdomas greičiau (vidutiniškai O(1)), palyginti su List (vidutiniškai O(n)).
    • Operacijos, pagrįstos indeksu (get, set), yra prieinamos tik List.
  • Įgyvendinimai:

    • Tipinės List įgyvendinimai: ArrayList, LinkedList, Vector.
    • Tipinės Set įgyvendinimai: HashSet, LinkedHashSet, TreeSet.

Štai pavyzdžiai, iliustruojantys skirtumus:

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 leidžia dubliuojamus elementus ir išlaiko tvarką
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Dubliuojamo elemento pridėjimas
        System.out.println("List: " + list); // Išves: [Apple, Banana, Apple]
        System.out.println("Elemento indeksas 1: " + list.get(1)); // Prieiga per indeksą

        // Set neleidžia dubliuojamų elementų ir tvarka nėra garantuojama (HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Bandymas pridėti dubliuojamą elementą - bus ignoruojama
        System.out.println("Set: " + set); // Išves kažką panašaus į [Apple, Banana] arba [Banana, Apple]
        // set.get(1); // Klaidų kompiliacijoje - nėra prieigos per indeksą
    }
}

Lyginamoji lentelė:

Savybė List Set
Tvarka Garantijuota (pridėjimo tvarka) Nėra garantuota (HashSet), tvarkyta (TreeSet)
Dublikatai Leidžiami Neleidžiami
Prieiga per indeksą Galima (get(int index)) Nėra galimybės
contains() našumas O(n) vidutiniškai (ArrayList) O(1) vidutiniškai (HashSet)
Tipinės įgyvendinimai ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet