Java HashSet

HashSet 是一个没有重复元素,不保证排序的 Set 集合。在本教程中,我们将通过示例 HashSet 和相关的操作。

在本教程中,我们将通过示例 HashSet 和相关的操作。

HashSet 是一个没有重复元素,不保证排序的 Set 集合。HashSet 内部使用 HashMap 实现,HashSet 中的元素都保存在内部 HashMap 的键中。

HashSet 实现了 Set 接口,实现了 Set 接口定义的所有行为。

创建一个 HashSet

我们导入 java.util.HashSet 类后,就可以通过构造方法创建 HashSet 对象了。例如:

HashSet<Integer> numbers = new HashSet<>(8, 0.75);

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

请注意 new HashSet<>(8, 0.75f),这里两个参数分别是初始容量和负载因子,由于 HashSet 内部使用 HashMap 实现,这两个参数其实传给内部 HashMap 的。请跳转到 Java HashMap 章节查看更多信息。

HashSet 也提供了默认的构造函数:

HashSet<Integer> numbers1 = new HashSet<>();

HashSet 的方法

HashSet 完全实现了 Set 接口定义的所有集合操作方法。

向 HashSet 插入元素

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

例如,

import java.util.HashSet;

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

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

    HashSet<Integer> numbers = new HashSet<>();

    numbers.addAll(evenNumber);
    numbers.add(5);
    System.out.println("New HashSet: " + numbers);
  }
}

输出

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

HashSet 迭代器

iterator() 返回一个迭代器,可以迭代当前 HashSet 对象中的元素。

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

public 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);

    Iterator<Integer> iterate = numbers.iterator();
    System.out.print("HashSet using Iterator: ");

    while (iterate.hasNext()) {
      System.out.print(iterate.next());
      System.out.print(", ");
    }
  }
}

输出

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

关于迭代器的更多信息,请转到 Java 迭代器章节查看。

删除元素

  • remove() - 从 HashSet 集合中删除指定的元素
  • removeAll() - 从 HashSet 集合中删除由参数指定的另一个集合的所有元素

例如,

import java.util.HashSet;

public 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);

    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

集合操作

集合的并集

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

import java.util.HashSet;

public 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]

集合的交集

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

import java.util.HashSet;

public 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("Intersection is: " + evenNumbers);
  }
}

输出

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

集合的差集

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

import java.util.HashSet;

public 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);

    primeNumbers.removeAll(oddNumbers);
    System.out.println("Difference : " + primeNumbers);
  }
}

输出

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

集合的子集

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

import java.util.HashSet;

public 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);

    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 subset of HashSet1? true

HashSet 的其他方法

  • clone() - 克隆一个 HashSet
  • contains() - 如果 HashSet 包含指定元素,则返回 true
  • isEmpty() - 检查 HashSet 是否为空
  • size() - 返回 HashSet 大小
  • clear() - 清空 HashSet