原文: https://javatutorial.net/java-hashset-example

使用哈希表进行存储的集合通常由 Java HashSet类创建。 顾名思义,HashSet实现Set接口,并且还使用一个哈希表,该哈希表是HashMap实例。HashSet中元素的顺序是随机的。 此类允许使用null元素。 就复杂度而言,HashSet为基本操作(如添加,删除,包含和大小)提供恒定的时间性能,前提是假定元素已被函数正确分散。

Java `HashSet`示例 - 图1

有关HashSet的重要信息

  • HashSet通过使用称为散列的机制来存储元素。
  • HashSet中不能存在重复的元素。
  • HashSet允许为空值。
  • HashSet类不同步。
  • HashSet的顺序不由插入顺序维护。 元素(在此类中)是根据其哈希码插入的。
  • 就搜索操作而言,由于HashSet具有恒定的时间复杂度,因此它是最好的方法。
  • HashSet的初始默认容量为 16,而负载系数为 0.75。

HashSet简单的结构图

Java `HashSet`示例 - 图2

Java 中的HashSet

我们放入HashMap中的每个对象都首先通过哈希算法发送。 该算法的唯一目的是为传递给它的每个对象生成一个称为哈希的唯一编号。 在上图中,此算法为字符串Lisa Morgan生成了数字 3,为Bob Wiliams生成了数字 2,为Jane Smith生成了数字 1。 以后,这些数字将作为索引存储在数组中。 每当您要对HashSet中的元素执行任何类型的操作时,您都将通过由哈希算法生成的索引来解决它们。 这就是HashSet以随机顺序返回元素的原因。 哈希号是HashSet知道的唯一顺序。

HashSet中的构造方法

  1. HashSet hashSet = new HashSet();
  2. HashSet hashSet = new HashSet(int initialCapacity);
  3. HashSet hashSet = new HashSet(int initialCapacity, float loadFactor);
  4. HashSet hashSet = new HashSet(Collection c);

这些构造函数之间的主要区别在于,在 #1 构造函数中,初始容量为 16,默认负载因子为 0.75,但在 #2 中,您实际上可以设置容量。 负载系数的默认值仍为 0.75。 在构造函数 3 中,您可以设置容量和负载系数。

HashSet类中的方法

  1. boolean add(Object o):用于添加作为参数提供的元素,如果不存在,则返回false
  2. void clear():用于删除所有元素。
  3. boolean contains(Object o):如果指定的ObjectHashSet中,则返回true;否则,返回false
  4. boolean remove(Object o):用于从HashSet中删除指定的Object(如果存在)。
  5. Iterator iterator():用于返回集合中元素上的迭代器。
  6. boolean isEmpty():用于检查HashSet是否为空。 如果为空,则返回true;否则为false
  7. int size():返回集合的大小。
  8. Object clone():创建集合的副本。

有关所有方法的文档,请访问 Oracle 官方文档页面

使用add()HashSet中添加元素

语法:HashSet.add(Object o);

  1. import java.io.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. }
  14. }

输出

  1. HashSet: [Elephant, Tiger, Lion]

使用clear()清空HashSet

语法:HashSet.clear();

输出

  1. import java.io.*;
  2. import java.util.HashSet;
  3. public class HashSetExample{
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. // Clearing the hash set
  14. animals.clear();
  15. // Displaying the final Set after clearing;
  16. System.out.println("The final set: " + animals);
  17. }
  18. }
  1. HashSet: [Elephant, Tiger, Lion]
  2. The final set: []

使用contains()检查HashSet中是否存在元素

语法:Hash_Set.contains(Object o)

  1. import java.io.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. // Checking for "Lion" in the hash set
  14. System.out.println("Does the HashSet contain 'Lion'? " + animals.contains("Lion"));
  15. // Checking for "Elephant" in the hash set
  16. System.out.println("Does the HashSet contain 'Elephant'? " + animals.contains("Elephant"));
  17. // Checking for "Tiger" in the hash set
  18. System.out.println("Does the HashSet contain 'Tiger'? " + animals.contains("Tiger"));
  19. // Checking for "Chicken" in the hash set
  20. System.out.println("Does the HashSet contain 'Chicken'? " + animals.contains("Chicken"));
  21. }
  22. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. Does the Set contain 'Lion'? true
  3. Does the Set contain 'Elephant? true
  4. Does the Set contain 'Tiger'? true
  5. Does the Set contain 'Chicken'? false

使用remove()HashSet中删除元素

语法:HashSet.remove(Object o)

  1. import java.util.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. set.remove("Elephant");
  14. set.remove("Lion");
  15. // Displaying the HashSet after removal
  16. System.out.println("HashSet after removing elements: " + animals);
  17. }
  18. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. HashSet after removing elements: [Tiger]

Iterator()方法

语法:Iterator iterator = HashSet.iterator();

  1. import java.util.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. // Creating an iterator
  14. Iterator iterator = animals.iterator();
  15. // Displaying the values after iterating through the set
  16. System.out.println("The iterator values are: ");
  17. while (iterator.hasNext()) {
  18. System.out.println(iterator.next());
  19. }
  20. }
  21. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. The iterator values are:
  3. Elephant
  4. Tiger
  5. Lion

使用isEmpty()检查HashSet是否为空

语法:HashSet.isEmpty();

  1. import java.io.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. // Check for the empty set
  14. System.out.println("Is the hash set empty: " + animals.isEmpty());
  15. set.clear();
  16. // Checking after we've cleared it out
  17. System.out.println("Is the hash set empty: " + animals.isEmpty());
  18. }
  19. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. Is the hash set empty: false
  3. Is the hash set empty: true

使用size()获取HashSet的大小

语法:HashSet.size();

  1. import java.util.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. // Displaying the HashSet
  12. System.out.println("HashSet: " + animals);
  13. // Get the size of the hash set
  14. System.out.println("The size of the hash set is: " + animals.size());
  15. }
  16. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. The size of the hash set is: 3

使用clone()克隆HashSet

语法:HashSet.clone()

  1. import java.io.*;
  2. import java.util.HashSet;
  3. public class HashSetExample {
  4. public static void main(String args[])
  5. {
  6. // Creating an empty HashSet
  7. HashSet<String> animals = new HashSet<String>();
  8. animals.add("Elephant");
  9. animals.add("Tiger");
  10. animals.add("Lion");
  11. System.out.println("HashSet: " + animals);
  12. // Creating a new set
  13. HashSet clonedSet = new HashSet();
  14. // Cloning the set using clone() method
  15. clonedSet = (HashSet)animals.clone();
  16. // Displaying the new hashset;
  17. System.out.println("The new set: " + clonedSet);
  18. }
  19. }

输出

  1. HashSet: [Elephant, Tiger, Lion]
  2. The new set: [Elephant, Tiger, Lion]

如何迭代HashSet

有两种方法可以遍历HashSet

  • 使用迭代器
  • 不使用迭代器

1)使用迭代器

  1. import java.util.HashSet;
  2. import java.util.Iterator;
  3. class IterateHashSetExample{
  4. public static void main(String[] args) {
  5. HashSet<String> animals= new HashSet<String>();
  6. //add elements to HashSet
  7. animals.add("Elephant");
  8. animals.add("Tiger");
  9. animals.add("Lion");
  10. Iterator<String> iterator = animals.iterator();
  11. while(iterator.hasNext()){
  12. System.out.println(iterator.next());
  13. }
  14. }
  15. }

上面的代码只是将迭代器“附加”到动物散列集上,然后仅打印每一个迭代器,直到没有更多为止。 另外,此方法将忽略重复项。 如果有重复项,则重复项仅打印一次。

输出

  1. Elephant
  2. Tiger
  3. Lion

2)不使用迭代器

  1. import java.util.HashSet;
  2. import java.util.Set;
  3. class IterateHashSetExample{
  4. public static void main(String[] args) {
  5. Set<String> animals = new HashSet<String>();
  6. //add elements to HashSet
  7. animals.add("Elephant");
  8. animals.add("Tiger");
  9. animals.add("Lion");
  10. for (String animal : animals) {
  11. System.out.println(animal);
  12. }
  13. }
  14. }

输出

  1. Elephant
  2. Tiger
  3. Lion