在本教程中,我們將學習Java HashSet類。我們將借助示例學習不同的哈希集方法和操作。
Java Collections框架的HashSet類提供了哈希表數(shù)據(jù)結構的功能。
它實現(xiàn)Set接口。
為了創(chuàng)建哈希集,我們必須先導入java.util.HashSet包。
導入包后,就可以在Java中創(chuàng)建哈希集。
//具有8個容量和0.75負載因子的HashSet HashSet<Integer> numbers = new HashSet<>(8, 0.75);
在這里,我們創(chuàng)建了一個名為的哈希集numbers。
注意,新的部分HashSet<>(8, 0.75)。這里,第一參數(shù)是容量,并且第二參數(shù)是負載因子。
capacity -該哈希集的容量為8。意味著,它可以存儲8個元素。
loadFactor - 此哈希集的負載因子為0.6。這意味著,只要我們的哈希集填充了60%,元素就會移到新哈希表中,該哈希表的大小是原始哈希表的兩倍。
默認容量和負載因子
創(chuàng)建散列表而不定義其容量和負載因子是可能的。例如,
//具有默認容量和負載因子的HashSet HashSet<Integer> numbers1 = new HashSet<>();
默認,
哈希集的容量將為 16
負載因子將為 0.75
HashSet類提供了各種方法,這些方法使我們可以對集合執(zhí)行各種操作。
add() - 將指定的元素插入集合
addAll() - 將指定集合的所有元素插入集合
例如,
import java.util.HashSet; class Main { public static void main(String[] args) { HashSet<Integer> evenNumber = new HashSet<>(); // 使用 add() 方法 evenNumber.add(2); evenNumber.add(4); evenNumber.add(6); System.out.println("HashSet: " + evenNumber); HashSet<Integer> numbers = new HashSet<>(); // 使用 addAll() 方法 numbers.addAll(evenNumber); numbers.add(5); System.out.println("New HashSet: " + numbers); } }
輸出結果
HashSet: [2, 4, 6] New HashSet: [2, 4, 5, 6]
要訪問哈希集合的元素,我們可以使用iterator()方法。為了使用此方法,我們必須導入java.util.Iterator包。例如,
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); // 調(diào)用iterator()方法 Iterator<Integer> iterate = numbers.iterator(); System.out.print("使用Iterator的HashSet: "); //訪問元素 while(iterate.hasNext()) { System.out.print(iterate.next()); System.out.print(", "); } } }
輸出結果
HashSet: [2, 5, 6] 使用Iterator的HashSet: 2, 5, 6,
remove() - 從集合中刪除指定的元素
removeAll() - 從集合中刪除所有元素
例如,
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); //使用remove()方法 boolean value1 = numbers.remove(5); System.out.println("值5被刪除? " + value1); boolean value2 = numbers.removeAll(numbers); System.out.println("所有的元素都被移除了嗎? " + value2); } }
輸出結果
HashSet: [2, 5, 6] 值5被刪除? true 所有的元素都被移除了嗎? true
HashSet類的各種方法也可以用于執(zhí)行各種set操作。
執(zhí)行兩個集合之間的并集,我們可以使用addAll()方法。例如
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); //集合并集 numbers.addAll(evenNumbers); System.out.println("Union is: " + numbers); } }
輸出結果
HashSet1: [2, 4] HashSet2: [1, 3] Union is: [1, 2, 3, 4]
要執(zhí)行兩個集合之間的交集,我們可以使用retainAll()方法。例如
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); //集合的交集 evenNumbers.retainAll(primeNumbers); System.out.println("交集: " + evenNumbers); } }
輸出結果
HashSet1: [2, 3] HashSet2: [2, 4] 交集: [2]
要計算兩組之間的差集,我們可以使用removeAll()方法。例如,
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); //HashSet1和HashSet2之間的差集 primeNumbers.removeAll(oddNumbers); System.out.println("Difference : " + primeNumbers); } }
輸出結果
HashSet1: [2, 3, 5] HashSet2: [1, 3, 5] 差集: [2]
要檢查一個集合是否是另一個集合的子集,我們可以使用containsAll()方法。例如,
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); //檢查primeNumbers是否是numbers的子集 boolean result = numbers.containsAll(primeNumbers); System.out.println("HashSet2是HashSet1的子集嗎? " + result); } }
輸出結果
HashSet1: [1, 2, 3, 4] HashSet2: [2, 3] HashSet2是HashSet1的子集嗎? true
方法 | 描述 |
---|---|
clone() | 創(chuàng)建HashSet副本 |
contains() | 在中搜索HashSet指定的元素,并返回布爾結果 |
isEmpty() | 檢查是否HashSet為空 |
size() | 返回HashSet的大小 |
clear() | 從HashSet中刪除所有元素 |
在Java中,如果我們必須隨機訪問元素,則通常使用HashSet。 這是因為哈希表中的元素是使用哈希碼訪問的。
元素的hashcode是唯一標識,它有助于標識散列表中的元素。
HashSet不能包含重復的元素。因此,每個散列集元素都有一個惟一的hashcode。
注意: HashSet不同步。也就是說,如果多個線程同時訪問哈希集合,并且其中一個線程修改了哈希集合。然后,它必須在外部同步。