




Studia grazie alle numerose risorse presenti su Docsity
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
Prepara i tuoi esami
Studia grazie alle numerose risorse presenti su Docsity
Prepara i tuoi esami con i documenti condivisi da studenti come te su Docsity
Trova i documenti specifici per gli esami della tua università
Preparati con lezioni e prove svolte basate sui programmi universitari!
Rispondi a reali domande d’esame e scopri la tua preparazione
Riassumi i tuoi documenti, fagli domande, convertili in quiz e mappe concettuali
Studia con prove svolte, tesine e consigli utili
Togliti ogni dubbio leggendo le risposte alle domande fatte da altri studenti come te
Esplora i documenti più scaricati per gli argomenti di studio più popolari
Ottieni i punti per scaricare
Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium
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
1 / 8
Questa pagina non è visibile nell’anteprima
Non perderti parti importanti!





1. Definizione matematica di Insieme
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
Operazione Definizione
Unione (A ∪ B) 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 (A ∩ B) 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 (B ⊆ A) 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
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.
7. Classe HashSet: struttura interna e tabella hash
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
Costruttore Descrizione
HashSet() Crea un nuovo HashSet vuoto con capacità e fattore di carico predefiniti.
9. I metodi hashCode() ed equals(): teoria e
implementazione
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.
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.