Guida al Classico HashSet di Java: Per Principianti

Introduzione

Ciao, futuri sviluppatori Java! Oggi immergeremo nel meraviglioso mondo di HashSet in Java. Non preoccupatevi se siete nuovi alla programmazione; vi guiderò attraverso questo viaggio passo per passo, proprio come ho fatto per innumerevoli studenti nei miei anni di insegnamento. Pensate a HashSet come una scatola magica che può memorizzare elementi unici - non sono ammessi duplicati! È come avere un cassetto speciale in cui puoi mettere solo un paio di ogni tipo di calze. Iniziamo!

Java - HashSet

Dichiarazione della Classe

In Java, HashSet fa parte del Java Collections Framework. Per utilizzarlo, dobbiamo prima importarlo:

import java.util.HashSet;

La dichiarazione di base di un HashSet è così:

HashSet<E> hs = new HashSet<E>();

Qui, 'E' è un segnaposto per il tipo di elementi che desiderate memorizzare nel vostro HashSet. Per esempio, se volete memorizzare stringhe:

HashSet<String> fruitBasket = new HashSet<String>();

Parametri

Quando create un HashSet, puoi specificare due parametri opzionali:

  1. Capacità iniziale: Il numero di "secchi" che HashSet utilizzerà per memorizzare gli elementi.
  2. Fattore di carico: Una misura di quanto pieno può essere l'HashSet prima che venga automaticamente ingrandito.

Non preoccupatevi troppo di questi per ora. Pensate a loro come impostazioni avanzate per la vostra scatola magica!

Costruttori della Classe

HashSet fornisce quattro costruttori. Esaminiamo ognuno di essi:

// Costruttore 1: Crea un HashSet vuoto con capacità iniziale predefinita (16) e fattore di carico (0.75)
HashSet<String> set1 = new HashSet<>();

// Costruttore 2: Crea un HashSet contenente elementi della collezione specificata
Collection<String> collection = Arrays.asList("Apple", "Banana", "Cherry");
HashSet<String> set2 = new HashSet<>(collection);

// Costruttore 3: Crea un HashSet vuoto con la capacità iniziale specificata e il fattore di carico predefinito (0.75)
HashSet<String> set3 = new HashSet<>(20);

// Costruttore 4: Crea un HashSet vuoto con la capacità iniziale e il fattore di carico specificati
HashSet<String> set4 = new HashSet<>(20, 0.8f);

Metodi della Classe

Ecco una tabella dei metodi più comunemente utilizzati di HashSet:

Metodo Descrizione
add(E e) Aggiunge l'elemento specificato a questo set se non è già presente
clear() Rimuove tutti gli elementi da questo set
contains(Object o) Restituisce true se questo set contiene l'elemento specificato
isEmpty() Restituisce true se questo set non contiene elementi
remove(Object o) Rimuove l'elemento specificato da questo set se presente
size() Restituisce il numero di elementi in questo set

Metodi Ereditati

HashSet eredita metodi dalle sue classi genitrici. Alcuni notevoli includono:

  • Da Set: addAll(), containsAll(), equals(), hashCode(), removeAll(), retainAll()
  • Da Collection: iterator(), toArray()
  • Da Object: clone(), finalize(), getClass(), notify(), notifyAll(), wait()

Esempio di Aggiunta di Elementi a un HashSet

Mettiamo la nostra conoscenza in pratica con un esempio divertente. Immaginiamo di creare un programma per tenere traccia dei gusti unici di gelato nel nostro negozio:

import java.util.HashSet;

public class IceCreamShop {
public static void main(String[] args) {
// Crea un nuovo HashSet per memorizzare i gusti di gelato
HashSet<String> flavors = new HashSet<>();

// Aggiungi alcuni gusti
flavors.add("Vanilla");
flavors.add("Chocolate");
flavors.add("Strawberry");
flavors.add("Mint Chip");

// Prova ad aggiungere un duplicato
boolean added = flavors.add("Vanilla");

System.out.println("Vanilla aggiunta di nuovo? " + added);
System.out.println("I nostri gusti di gelato: " + flavors);
System.out.println("Abbiamo " + flavors.size() + " gusti unici!");

// Controlla se abbiamo un gusto specifico
String searchFlavor = "Rocky Road";
if (flavors.contains(searchFlavor)) {
System.out.println("Sì, abbiamo " + searchFlavor + "!");
} else {
System.out.println("Mi dispiace, non abbiamo " + searchFlavor + ".");
}

// Rimuovi un gusto
flavors.remove("Strawberry");
System.out.println("Gusti aggiornati dopo aver rimosso Strawberry: " + flavors);
}
}

Output

Quando esegui questo programma, vedrai qualcosa del genere:

Vanilla aggiunta di nuovo? false
I nostri gusti di gelato: [Vanilla, Mint Chip, Chocolate, Strawberry]
Abbiamo 4 gusti unici!
Mi dispiace, non abbiamo Rocky Road.
Gusti aggiornati dopo aver rimosso Strawberry: [Vanilla, Mint Chip, Chocolate]

Ecco cosa è successo:

  1. Abbiamo creato un HashSet chiamato flavors per memorizzare i nostri gusti di gelato.
  2. Abbiamo aggiunto quattro gusti: Vanilla, Chocolate, Strawberry e Mint Chip.
  3. Abbiamo cercato di aggiungere Vanilla di nuovo, ma add() ha restituito false perché HashSet non permette duplicati.
  4. Abbiamo stampato tutti i nostri gusti. Notate che l'ordine potrebbe essere diverso da come li abbiamo aggiunti - HashSet non mantiene l'ordine di inserimento.
  5. Abbiamo controllato se avevamo il gusto Rocky Road utilizzando contains(). Non l'avevamo, quindi ha stampato un messaggio di "mi dispiace".
  6. Infine, abbiamo rimosso Strawberry e stampato l'insieme aggiornato di gusti.

Ed eccoci qui! Avete appena creato il vostro primo HashSet e utilizzato alcuni dei suoi metodi più importanti. Ricordate, HashSet è fantastico quando avete bisogno di memorizzare elementi unici e non vi importa dell'ordine. È come una borsa di biglie dove ogni biglia ha un colore diverso - puoi facilmente controllare se hai un colore specifico, ma non puoi controllare l'ordine in cui escono quando versi la borsa.

Man mano che continuate il vostro viaggio con Java, scoprirete che HashSet è incredibilmente utile in molti scenari. Continuate a praticare, e presto diventerete dei maestri in HashSet! Buon coding!

Credits: Image by storyset