📜  Java HashSet类

📅  最后修改于: 2020-09-26 14:43:42             🧑  作者: Mango

在本教程中,我们将学习Java HashSet类。我们将借助示例学习不同的哈希集方法和操作。

Java Collections框架的HashSet类提供了哈希表数据结构的功能。

它实现了Set接口。

Java HashSet类实现Set接口。


创建一个哈希集

为了创建哈希集,我们必须首先导入java.util.HashSet包。

导入包后,就可以在Java中创建哈希集。

// HashSet with 8 capacity and 0.75 load factor
HashSet numbers = new HashSet<>(8, 0.75);

在这里,我们创建了一个名为numbers的哈希集。

注意,部分为new HashSet<>(8, 0.75) 。这里,第一参数是容量 ,并且第二参数是loadFactor。

  • 容量 -此哈希集的容量为8。意味着,它可以存储8个元素。
  • loadFactor-此哈希集的负载系数为0.6。这意味着,只要我们的哈希集填充了60%,元素就会移到新哈希表中,该哈希表的大小是原始哈希表的两倍。

默认容量和负载系数

创建散列表而不定义其容量和负载因子是可能的。例如,

// HashSet with default capacity and load factor
HashSet numbers1 = new HashSet<>();

默认情况下,

  • 哈希集的容量将为16
  • 负载系数将为0.75

HashSet的方法

HashSet类提供了各种方法,使我们可以在集合上执行各种操作。


将元素插入HashSet
  • add() -将指定的元素插入到集合中
  • addAll() -将指定集合的所有元素插入集合中

例如,

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet evenNumber = new HashSet<>();

        // Using add() method
        evenNumber.add(2);
        evenNumber.add(4);
        evenNumber.add(6);
        System.out.println("HashSet: " + evenNumber);

        HashSet numbers = new HashSet<>();
        
        // Using addAll() method
        numbers.addAll(evenNumber);
        numbers.add(5);
        System.out.println("New HashSet: " + numbers);
    }
}

输出

HashSet: [2, 4, 6]
New HashSet: [2, 4, 5, 6]

访问HashSet元素

要访问哈希集的元素,我们可以使用iterator()方法。为了使用此方法,我们必须导入java.util.Iterator包。例如,

import java.util.HashSet;
import java.util.Iterator;

class Main {
    public static void main(String[] args) {
        HashSet numbers = new HashSet<>();
        numbers.add(2);
        numbers.add(5);
        numbers.add(6);
        System.out.println("HashSet: " + numbers);

        // Calling iterator() method
        Iterator iterate = numbers.iterator();
        System.out.print("HashSet using Iterator: ");
        // Accessing elements
        while(iterate.hasNext()) {
            System.out.print(iterate.next());
            System.out.print(", ");
        }
    }
}

输出

HashSet: [2, 5, 6]
HashSet using Iterator: 2, 5, 6,

删除元素
  • remove() -从集合中移除指定的元素
  • removeAll() -从集合中删除所有元素

例如,

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet 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);
    }
}

输出

HashSet: [2, 5, 6]
Is 5 removed? true
Are all elements removed? true

设定作业

HashSet类的各种方法也可以用于执行各种设置操作。


集联合

两个执行两个集合之间的联合,我们可以使用addAll()方法。例如,

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet evenNumbers = new HashSet<>();
        evenNumbers.add(2);
        evenNumbers.add(4);
        System.out.println("HashSet1: " + evenNumbers);

        HashSet 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);
    }
}

输出

HashSet1: [2, 4]
HashSet2: [1, 3]
Union is: [1, 2, 3, 4]

集的交集

为了执行两个集合之间的交集,我们可以使用retainAll()方法。例如

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet primeNumbers = new HashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        System.out.println("HashSet1: " + primeNumbers);

        HashSet 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);
    }
}

输出

HashSet1: [2, 3]
HashSet2: [2, 4]
Intersection is: [2]

集的差异

要计算两个集合之间的差,我们可以使用removeAll()方法。例如,

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet primeNumbers = new HashSet<>();
        primeNumbers.add(2);
        primeNumbers.add(3);
        primeNumbers.add(5);
        System.out.println("HashSet1: " + primeNumbers);

        HashSet 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);
    }
}

输出

HashSet1: [2, 3, 5]
HashSet2: [1, 3, 5]
Difference: [2]

子集

要检查一个集合是否是另一个集合的子集,可以使用containsAll()方法。例如,

import java.util.HashSet;

class Main {
    public static void main(String[] args) {
        HashSet numbers = new HashSet<>();
        numbers.add(1);
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        System.out.println("HashSet1: " + numbers);

        HashSet 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);
    }
}

输出

HashSet1: [1, 2, 3, 4]
HashSet2: [2, 3]
Is HashSet2 is a subset of HashSet1? true

HashSet的其他方法
Method Description
clone() Creates a copy of the HashSet
contains() Searches the HashSet for the specified element and returns a boolean result
isEmpty() Checks if the HashSet is empty
size() Returns the size of the HashSet
clear() Removes all the elements from the HashSet

要了解有关HashSet方法的更多信息,请访问Java HashSet(Java官方文档)。


为什么要使用HashSet?

在Java中,如果我们必须随机访问元素,则通常使用HashSet 。这是因为哈希表中的元素是使用哈希码访问的。

元素的哈希码是唯一的标识,有助于标识哈希表中的元素。

HashSet不能包含重复的元素。因此,每个哈希集元素都有一个唯一的哈希码。

注意: HashSet不同步。也就是说,如果多个线程同时访问哈希集,并且其中一个线程修改了哈希集。然后,它必须在外部同步。