Sobes.tech
Junior

Ποια είναι η διαφορά μεταξύ των διεπαφών List και Set στη Java;

sobes.tech AI

Απάντηση από AI

Οι βασικές διαφορές μεταξύ των διεπαφών List και Set στη Java είναι οι εξής:

  • Σειρά των στοιχείων:

    • Το List διατηρεί τη σειρά εισαγωγής των στοιχείων. Τα στοιχεία έχουν δείκτες που ξεκινούν από το 0.
    • Το Set δεν εγγυάται τη σειρά των στοιχείων. Ορισμένες υλοποιήσεις μπορεί να έχουν μια ορισμένη σειρά (π.χ., LinkedHashSet, TreeSet), αλλά η διεπαφή Set δεν το απαιτεί.
  • Διπλότυπα:

    • Το List επιτρέπει την αποθήκευση διπλότυπων στοιχείων.
    • Το Set δεν επιτρέπει διπλότυπα. Όταν προσπαθείτε να προσθέσετε ένα διπλότυπο, η λειτουργία είτε αγνοείται είτε επιστρέφει false (ανάλογα με την υλοποίηση και τη μέθοδο).
  • Απόδοση:

    • Οι λειτουργίες προσθήκης και διαγραφής στο μέσο ενός List μπορεί να είναι πιο αργές (ειδικά για το ArrayList) από το Set.
    • Ο έλεγχος αν ένα στοιχείο υπάρχει (contains) σε ένα Set βασισμένο σε hashing (HashSet) είναι γενικά πιο γρήγορος (μέσος όρος O(1)) σε σύγκριση με ένα List (μέσος όρος O(n)).
    • Οι λειτουργίες βάσει δείκτη (get, set) είναι διαθέσιμες μόνο στο List.
  • Υλοποιήσεις:

    • Τυπικές υλοποιήσεις του List: ArrayList, LinkedList, Vector.
    • Τυπικές υλοποιήσεις του Set: HashSet, LinkedHashSet, TreeSet.

Ακολουθούν παραδείγματα που δείχνουν τις διαφορές:

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` επιτρέπει διπλότυπα και διατηρεί τη σειρά
        List<String> list = new ArrayList<>();
        list.add("Apple");
        list.add("Banana");
        list.add("Apple"); // Προσθέτουμε ένα διπλότυπο
        System.out.println("List: " + list); // Θα εμφανίσει [Apple, Banana, Apple]
        System.out.println("Στοιχείο στη θέση 1: " + list.get(1)); // Πρόσβαση με δείκτη

        // Το `Set` δεν επιτρέπει διπλότυπα και η σειρά δεν εγγυάταιται (για το HashSet)
        Set<String> set = new HashSet<>();
        set.add("Apple");
        set.add("Banana");
        set.add("Apple"); // Προσπάθεια προσθήκης διπλότυπου - θα αγνοηθεί
        System.out.println("Set: " + set); // Θα εμφανίσει κάτι όπως [Apple, Banana] ή [Banana, Apple]
        // set.get(1); // Σφάλμα μεταγλώττισης - δεν υπάρχει πρόσβαση με δείκτη
    }
}

Πίνακας σύγκρισης:

Χαρακτηριστικό List Set
Σειρά Εγγυημένη (σειρά εισαγωγής) Μη εγγυημένη (για το HashSet, το TreeSet έχει ταξινομημένη σειρά)
Διπλότυπα Επιτρέπονται Δεν επιτρέπονται
Πρόσβαση με δείκτη Δυνατή (get(int index)) Αδύνατη
Απόδοση contains() O(n) μέσος όρος (για ArrayList) O(1) μέσος όρος (για HashSet)
Τυπικές υλοποιήσεις ArrayList, LinkedList, Vector HashSet, LinkedHashSet, TreeSet