Java HashSet-klasse
Java HashSet-klasse
In deze zelfstudie leren we over de Java HashSet-klasse. We leren over verschillende hash-setmethoden en -bewerkingen aan de hand van voorbeelden.
De HashSet
class van het Java Collections-framework biedt de functionaliteiten van de hash-tabelgegevensstructuur.
Het implementeert de Set-interface.
Een HashSet maken
Om een hash-set te maken, moeten we de java.util.HashSet
. importeren pakket eerst.
Zodra we het pakket hebben geïmporteerd, kunnen we als volgt hash-sets maken in Java.
// HashSet with 8 capacity and 0.75 load factor
HashSet<Integer> numbers = new HashSet<>(8, 0.75);
Hier hebben we een hash-set gemaakt met de naam numbers
.
Let op, het deel nieuwe HashSet<>(8, 0.75)
. Hier is de eerste parameter capaciteit , en de tweede parameter is loadFactor .
- capaciteit - De capaciteit van deze hash-set is 8. Dit betekent dat er 8 elementen in kunnen worden opgeslagen.
- loadFactor - De belastingsfactor van deze hashset is 0,6. Dit betekent dat wanneer onze hash-set voor 60% is gevuld, de elementen worden verplaatst naar een nieuwe hashtabel van het dubbele van de oorspronkelijke hashtabel.
Standaardcapaciteit en belastingsfactor
Het is mogelijk om een hashtabel te maken zonder de capaciteit en belastingsfactor te definiëren. Bijvoorbeeld,
// HashSet with default capacity and load factor
HashSet<Integer> numbers1 = new HashSet<>();
Standaard,
- de capaciteit van de hash-set is 16
- de belastingsfactor zal 0,75 zijn
Methoden van HashSet
De HashSet
class biedt verschillende methoden waarmee we verschillende bewerkingen op de set kunnen uitvoeren.
Elementen invoegen in HashSet
add()
- voegt het opgegeven element toe aan de setaddAll()
- voegt alle elementen van de opgegeven verzameling toe aan de set
Bijvoorbeeld,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumber = new HashSet<>();
// Using add() method
evenNumber.add(2);
evenNumber.add(4);
evenNumber.add(6);
System.out.println("HashSet: " + evenNumber);
HashSet<Integer> numbers = new HashSet<>();
// Using addAll() method
numbers.addAll(evenNumber);
numbers.add(5);
System.out.println("New HashSet: " + numbers);
}
}
Uitvoer
HashSet: [2, 4, 6] New HashSet: [2, 4, 5, 6]
Toegang tot HashSet-elementen
Om toegang te krijgen tot de elementen van een hash-set, kunnen we de iterator()
. gebruiken methode. Om deze methode te gebruiken, moeten we de java.util.Iterator
. importeren pakket. Bijvoorbeeld,
import java.util.HashSet;
import java.util.Iterator;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
// Calling iterator() method
Iterator<Integer> iterate = numbers.iterator();
System.out.print("HashSet using Iterator: ");
// Accessing elements
while(iterate.hasNext()) {
System.out.print(iterate.next());
System.out.print(", ");
}
}
}
Uitvoer
HashSet: [2, 5, 6] HashSet using Iterator: 2, 5, 6,
Elementen verwijderen
remove()
- verwijdert het opgegeven element uit de setremoveAll()
- verwijdert alle elementen uit de set
Bijvoorbeeld,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(2);
numbers.add(5);
numbers.add(6);
System.out.println("HashSet: " + numbers);
// Using remove() method
boolean value1 = numbers.remove(5);
System.out.println("Is 5 removed? " + value1);
boolean value2 = numbers.removeAll(numbers);
System.out.println("Are all elements removed? " + value2);
}
}
Uitvoer
HashSet: [2, 5, 6] Is 5 removed? true Are all elements removed? true
Bewerkingen instellen
De verschillende methoden van de HashSet
class kan ook worden gebruikt om verschillende set-bewerkingen uit te voeren.
Union van sets
Om de unie tussen twee sets uit te voeren, kunnen we de addAll()
. gebruiken methode. Bijvoorbeeld,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("HashSet1: " + evenNumbers);
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(3);
System.out.println("HashSet2: " + numbers);
// Union of two set
numbers.addAll(evenNumbers);
System.out.println("Union is: " + numbers);
}
}
Uitvoer
HashSet1: [2, 4] HashSet2: [1, 3] Union is: [1, 2, 3, 4]
Kruispunt van verzamelingen
Om de kruising tussen twee sets uit te voeren, kunnen we de retainAll()
. gebruiken methode. Bijvoorbeeld
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("HashSet1: " + primeNumbers);
HashSet<Integer> evenNumbers = new HashSet<>();
evenNumbers.add(2);
evenNumbers.add(4);
System.out.println("HashSet2: " + evenNumbers);
// Intersection of two sets
evenNumbers.retainAll(primeNumbers);
System.out.println("Intersection is: " + evenNumbers);
}
}
Uitvoer
HashSet1: [2, 3] HashSet2: [2, 4] Intersection is: [2]
Verschil van sets
Om het verschil tussen de twee sets te berekenen, kunnen we de removeAll()
. gebruiken methode. Bijvoorbeeld,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
primeNumbers.add(5);
System.out.println("HashSet1: " + primeNumbers);
HashSet<Integer> oddNumbers = new HashSet<>();
oddNumbers.add(1);
oddNumbers.add(3);
oddNumbers.add(5);
System.out.println("HashSet2: " + oddNumbers);
// Difference between HashSet1 and HashSet2
primeNumbers.removeAll(oddNumbers);
System.out.println("Difference : " + primeNumbers);
}
}
Uitvoer
HashSet1: [2, 3, 5] HashSet2: [1, 3, 5] Difference: [2]
Subset
Om te controleren of een set een subset is van een andere set of niet, kunnen we de containsAll()
. gebruiken methode. Bijvoorbeeld,
import java.util.HashSet;
class Main {
public static void main(String[] args) {
HashSet<Integer> numbers = new HashSet<>();
numbers.add(1);
numbers.add(2);
numbers.add(3);
numbers.add(4);
System.out.println("HashSet1: " + numbers);
HashSet<Integer> primeNumbers = new HashSet<>();
primeNumbers.add(2);
primeNumbers.add(3);
System.out.println("HashSet2: " + primeNumbers);
// Check if primeNumbers is a subset of numbers
boolean result = numbers.containsAll(primeNumbers);
System.out.println("Is HashSet2 is subset of HashSet1? " + result);
}
}
Uitvoer
HashSet1: [1, 2, 3, 4] HashSet2: [2, 3] Is HashSet2 is a subset of HashSet1? true
Andere methoden van HashSet
Methode | Beschrijving |
---|---|
clone() | Maakt een kopie van de HashSet |
contains() | Zoekt de HashSet voor het opgegeven element en geeft een booleaans resultaat |
isEmpty() | Controleert of de HashSet is leeg |
size() | Retourneert de grootte van de HashSet |
clear() | Verwijdert alle elementen uit de HashSet |
Ga voor meer informatie over HashSet-methoden naar Java HashSet (officiële Java-documentatie).
Waarom HashSet?
In Java, HashSet
wordt vaak gebruikt als we willekeurig toegang moeten krijgen tot elementen. Dit komt doordat elementen in een hashtabel worden benaderd met hashcodes.
De hashcode van een element is een unieke identiteit die helpt om het element in een hashtabel te identificeren.
HashSet
mag geen dubbele elementen bevatten. Daarom heeft elk hashset-element een unieke hashcode.
Opmerking: HashSet is niet gesynchroniseerd. Dat wil zeggen als meerdere threads tegelijkertijd toegang hebben tot de hash-set en een van de threads de hash-set wijzigt. Dan moet het extern worden gesynchroniseerd.
Java