Set.of în Java

Mulțimi (Set, HashSet, TreeSet) Java 9 (copyOf: Java 10)

Creează o mulțime nemodificabilă din valorile date (of) sau dintr-o colecție existentă (copyOf). Ordinea nu este garantată.

Sintaxă
static <E> Set<E> of(E... elements)
static <E> Set<E> copyOf(Collection<? extends E> coll)

Ce face Set.of

Set.of(a, b, c) creează rapid o mulțime fixă, fără duplicate. Dacă dai de două ori aceeași valoare, apare IllegalArgumentException: of consideră duplicatele o greșeală. null nu este permis.

Set.copyOf(colectie) face o copie nemodificabilă a oricărei colecții; aici duplicatele sunt eliminate fără eroare. Dacă originalul se schimbă după copiere, copia rămâne la fel.

Ambele mulțimi sunt nemodificabile: add, remove, clear aruncă UnsupportedOperationException. Ordinea de parcurgere nu este garantată și se schimbă de la o rulare la alta, deci nu le afișa direct dacă ordinea contează: copiază în TreeSet.

Parametri

Parametru Descriere
elements Valorile mulțimii (distincte, fără null).
coll Colecția de copiat (fără null).

Ce returnează

O mulțime nemodificabilă.

Exemple

Exemplul 1: Vocalele, pentru verificări rapide

import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Character> vocale = Set.of('a', 'e', 'i', 'o', 'u', 'ă', 'â', 'î');
        String cuvant = "învățătoare";
        int nr = 0;
        for (char c : cuvant.toCharArray()) {
            if (vocale.contains(c)) {
                nr++;
            }
        }
        System.out.println(cuvant + " are " + nr + " vocale");
    }
}

Rezultat

învățătoare are 6 vocale

Exemplul 2: copyOf elimină duplicatele, of le refuză

import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        List<String> orase = List.of("Iași", "Cluj", "Iași");
        Set<String> copie = Set.copyOf(orase);
        System.out.println("copyOf: " + new TreeSet<>(copie));

        try {
            Set.of("Iași", "Cluj", "Iași");
        } catch (IllegalArgumentException e) {
            System.out.println("of cu duplicat: IllegalArgumentException");
        }
        try {
            copie.add("Arad");
        } catch (UnsupportedOperationException e) {
            System.out.println("add: UnsupportedOperationException");
        }
    }
}

Rezultat

copyOf: [Cluj, Iași]
of cu duplicat: IllegalArgumentException
add: UnsupportedOperationException

Greșeli frecvente

  • Afișezi direct un Set.of(...) și te aștepți la aceeași ordine. Ordinea se schimbă între rulări.
  • Scrii Set.of cu valori care se pot repeta (de exemplu citite de la utilizator). Folosește Set.copyOf(lista) sau new HashSet<>(lista).
  • Vrei o mulțime modificabilă cu valori inițiale și folosești Set.of. Scrie new HashSet<>(Set.of(...)).

Comenzi înrudite

  • Set: Interfața pentru mulțimi: colecții fără duplicate, în care întrebi rapid dacă un element există.
  • List.of: Creează o listă nemodificabilă din valorile date (of) sau dintr-o copie a altei colecții (copyOf).
  • Map.of: Creează un map nemodificabil din perechi date direct (of, ofEntries) sau copiind alt map (copyOf). Ordinea nu este garantată.
  • Set.ofLazy: Mulțime nemodificabilă formată din candidații care îndeplinesc o condiție; condiția se calculează abia când întrebi de un element.
  • Collections.unmodifiableList: Returnează o vedere doar-pentru-citire a unei liste: cine o primește nu o poate modifica, dar schimbările originalului se văd.