Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


L'interfaccia Set e la classe HashSet in Java, Schemi e mappe concettuali di Programmazione Java

Argomenti trattati 1. Definizione matematica di Insieme 2. Operazioni tra insiemi: Unione, Intersezione, Differenza, Contenuto 3. Quando usare un Set in Java 4. Interfaccia Set: gerarchia e caratteristiche 5. Metodi dell'interfaccia Set per le operazioni insiemistiche 6. Altri metodi ereditati da Collection 7. Classe HashSet: struttura interna e tabella hash 8. Costruttori di HashSet 9. I metodi hashCode()

Tipologia: Schemi e mappe concettuali

2025/2026

In vendita dal 17/04/2026

airruh
airruh 🇮🇹

4.7

(17)

73 documenti

1 / 8

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
Set in Java
Insiemi, interfaccia Set, classe HashSet e metodi hashCode/equals
Argomenti trattati
1. Definizione matematica di Insieme
2. Operazioni tra insiemi: Unione, Intersezione, Differenza, Contenuto
3. Quando usare un Set in Java
4. Interfaccia Set: gerarchia e caratteristiche
5. Metodi dell'interfaccia Set per le operazioni insiemistiche
6. Altri metodi ereditati da Collection
7. Classe HashSet: struttura interna e tabella hash
8. Costruttori di HashSet
9. I metodi hashCode() ed equals(): teoria e implementazione
10. Riepilogo
pf3
pf4
pf5
pf8

Anteprima parziale del testo

Scarica L'interfaccia Set e la classe HashSet in Java e più Schemi e mappe concettuali in PDF di Programmazione Java solo su Docsity!

Set in Java

Insiemi, interfaccia Set, classe HashSet e metodi hashCode/equals

Argomenti trattati

1. Definizione matematica di Insieme

2. Operazioni tra insiemi: Unione, Intersezione, Differenza, Contenuto

3. Quando usare un Set in Java

4. Interfaccia Set: gerarchia e caratteristiche

5. Metodi dell'interfaccia Set per le operazioni insiemistiche

6. Altri metodi ereditati da Collection

7. Classe HashSet: struttura interna e tabella hash

8. Costruttori di HashSet

9. I metodi hashCode() ed equals(): teoria e implementazione

10. Riepilogo

1. Definizione matematica di Insieme

Un insieme è una collezione di elementi, ovvero un raggruppamento di oggetti che condividono

una o più caratteristiche in comune. Il concetto di insieme in Java rispecchia fedelmente la

definizione matematica, con tre proprietà fondamentali:

Proprietà Descrizione

Unicità Ogni elemento può esistere all'interno dell'insieme una sola volta. Non sono ammessi duplicati.

Non ordinato L'ordine degli elementi all'interno di un insieme non è definito né garantito.

Appartenenza Un elemento o appartiene all'insieme oppure non vi appartiene: non esistono gradi intermedi.

2. Operazioni tra insiemi

Le quattro operazioni principali che si possono eseguire tra insiemi sono:

Operazione Definizione

Unione (AB) Produce un insieme contenente tutti gli elementi del primo insieme e del secondo insieme. Gli elementi in comune appaiono una sola volta nel risultato.

Intersezione (AB) Produce un insieme contenente solo gli elementi presenti contemporaneamente in entrambi gli insiemi.

Differenza (A \ B) Produce un insieme formato dagli elementi del primo insieme che non appartengono al secondo insieme.

Contenuto (BA) Un insieme B è contenuto in un insieme A se ogni elemento di B appartiene anche ad A. Equivale a verificare che la differenza A \ B = A.

3. Quando usare un Set in Java

Il Java Collections Framework mette a disposizione l'interfaccia Set ogni volta che il programma

ha bisogno di una struttura dati che:

  • memorizzi elementi senza ammettere duplicati ;
  • non richieda di conoscere o preservare l'ordine di inserimento degli elementi;
  • debba supportare efficientemente le operazioni di unione, intersezione e differenza.

Esempi pratici: elenco di codici fiscali univoci, lista di tag associati a un articolo, insieme di indirizzi IP distinti, permessi assegnati a un utente.

boolean add(E obj) Inserisce obj nell'insieme. Restituisce false se obj è già presente (no duplicati).

boolean remove(Object obj) Rimuove obj dall'insieme, se presente.

boolean contains(Object obj)

Restituisce true se obj è contenuto nell'insieme.

boolean isEmpty() Restituisce true se l'insieme è vuoto.

int size() Restituisce il numero di elementi (cardinalità) dell'insieme.

void clear() Rimuove tutti gli elementi dall'insieme.

Iterator iterator() Restituisce un iteratore per visitare gli elementi uno alla volta.

Object[] toArray() Restituisce un array con tutti gli elementi dell'insieme.

boolean equals(Object obj) Confronta questo insieme con obj per verificarne l'uguaglianza.

La documentazione completa è disponibile su:

https://docs.oracle.com/javase/8/docs/api/java/util/Set.html

7. Classe HashSet: struttura interna e tabella hash

La principale implementazione concreta dell'interfaccia Set è la classe HashSet. Il prefisso

Hash indica che internamente la struttura usa una tabella hash.

Cos'è una tabella hash?

  • È una struttura dati che immagazzina e recupera elementi in memoria in maniera molto

efficiente.

  • È tipicamente implementata come combinazione di un array e di liste concatenate.
  • Ad ogni elemento viene assegnata una chiave numerica (hash code) che determina la

posizione nella tabella.

  • Nota la chiave, è possibile recuperare l'elemento direttamente, senza scorrere tutta la

struttura.

Come funziona l'inserimento:

Quando si chiama add(elemento), la HashSet invoca elemento.hashCode() per ottenere

un numero intero, lo trasforma in un indice dell'array interno (bucket) e colloca l'elemento in

quella cella. Se nella stessa cella esiste già un elemento, i due vengono collegati in una lista

concatenata (fenomeno detto collisione ).

Esempio visivo di tabella hash per un HashSet di stringhe:

Indice Bucket Collisioni

0 "casa" → "naso" (stessa hash!)

1 vuoto (null)

2 "fiore" → "terra" → "sole" (collisioni!)

3 vuoto (null)

4 "albero"

La HashSet non garantisce alcun ordinamento degli elementi. L'ordine di iterazione può differire dall'ordine di inserimento.

8. Costruttori di HashSet

La classe HashSet implementa tutti i metodi dell'interfaccia Set senza aggiungerne di propri, ad

eccezione dei costruttori. Il parametro generico indica il tipo degli elementi contenuti

nell'insieme.

Costruttore Descrizione

HashSet() Crea un nuovo HashSet vuoto con capacità e fattore di carico predefiniti.

9. I metodi hashCode() ed equals(): teoria e

implementazione

Quando si usa HashSet con una classe personalizzata (creata da zero), è obbligatorio fare

l'override dei due metodi ereditati da java.lang.Object:

  • public int hashCode()
  • public boolean equals(Object obj)

Ruolo di hashCode():

  • Deve restituire un numero intero che rappresenta un identificativo (idealmente univoco) per

l'oggetto.

  • La HashSet usa questo intero per determinare in quale bucket della tabella hash inserire

l'elemento.

  • Regola fondamentale: se due oggetti sono uguali secondo equals(), devono produrre lo

stesso hashCode.

Ruolo di equals():

  • Dopo aver individuato il bucket tramite hashCode(), la HashSet usa equals() per controllare se

l'oggetto è già presente nell'insieme.

  • Se equals() restituisce true, l'elemento è considerato duplicato e non viene aggiunto.
  • Se non si fa l'override, viene usata la versione di Object che confronta i riferimenti in memoria

(==), non il contenuto logico.

Come si sceglie cosa confrontare in equals():

Due oggetti devono essere considerati uguali quando rappresentano la stessa entità logica,

indipendentemente dall'istanza in memoria. Ad esempio, due oggetti Persona con lo stesso

codice fiscale sono logicamente la stessa persona, anche se sono istanze diverse.

Esempio di implementazione per una classe Persona (con nome e

cognome):

public class Persona { private String nome; private String cognome; // --- hashCode: combinazione basata su nome e cognome --- @Override public int hashCode() { final int prime = 31; int result = 1; // Se cognome è null contribuisce 0, altrimenti il suo hashCode result = prime * result + ((cognome == null)? 0 : cognome.hashCode()); // Stessa logica per nome result = prime * result + ((nome == null)? 0 : nome.hashCode()); return result; } // --- equals: due Persona sono uguali se hanno stesso nome E cognome --- @Override public boolean equals(Object obj) { if (this == obj) return true; // stessa istanza if (obj == null) return false; // obj è null if (!(obj instanceof Persona)) return false; // tipo diverso Persona altra = (Persona) obj; // Confronto campo per campo if (cognome == null) { if (altra.cognome != null) return false; } else if (!cognome.equals(altra.cognome)) return false; if (nome == null) { if (altra.nome != null) return false; } else if (!nome.equals(altra.nome)) return false; return true; } }

Effetti di una cattiva implementazione: se hashCode() produce troppo spesso lo stesso valore per oggetti diversi (collisioni frequenti), gli elementi si accumulano nello stesso bucket e la ricerca degenera da O(1) a O(n), annullando il vantaggio della tabella hash.

n Per ogni classe personalizzata usata in una HashSet, fare l'override di hashCode() ed

equals() in modo coerente è INDISPENSABILE!

10. Riepilogo

Concetto Punti chiave

Insieme (Set) Collezione senza duplicati e senza ordinamento definito. Supporta unione, intersezione, differenza e verifica di inclusione.

Interfaccia Set Estende Collection. Non aggiunge metodi, ma restringe add() per impedire duplicati. Usa equals() per il confronto.

Operazioni insiemistiche addAll() = unione, retainAll() = intersezione, removeAll() = differenza, containsAll() = contenuto.

Classe HashSet Implementazione concreta di Set. Usa tabella hash internamente. Nessun ordine garantito. Alte prestazioni con hashCode/equals corretti.

Tabella hash Struttura array + liste concatenate. L'hash code determina il bucket. Collisione = stessa cella per oggetti diversi, gestita con chaining.

hashCode() Deve essere overridden nelle classi personalizzate. Due oggetti uguali devono avere lo stesso hashCode.

equals() Deve essere overridden per definire l'uguaglianza logica. Indispensabile per il corretto funzionamento di HashSet.