Java HashSet 教程与示例

x33g5p2x  于2021-10-16 转载在 Java  
字(7.5k)|赞(0)|评价(0)|浏览(333)

Java HashSet 类是 Java 集合框架的成员。它实现了 Set 接口。 HashSet 用于存储唯一 元素的集合。

以下是 Java 中关于 HashSet 需要注意的几个关键点 -

HashSet 不能包含重复值。
*
HashSet 允许 null 值。
*
HashSet 是一个无序集合。它不保持元素插入的顺序。
*
HashSet 内部使用 HashMap 来存储其元素。
*
HashSet 不是线程安全的。如果多个线程同时尝试修改一个 HashSet,那么最终结果是不确定的。您必须在多线程环境中显式同步对 HashSet 的并发访问。

创建一个 HashSet 并向其添加新元素。

下面的示例展示了如何使用 HashSet() 构造函数创建 HashSet,并使用 add() 方法向其添加新元素。

import java.util.HashSet;
import java.util.Set;

public class CreateHashSetExample {
    public static void main(String[] args) {
        // Creating a HashSet
        Set<String> daysOfWeek = new HashSet<>();

        // Adding new elements to the HashSet
        daysOfWeek.add("Monday");
        daysOfWeek.add("Tuesday");
        daysOfWeek.add("Wednesday");
        daysOfWeek.add("Thursday");
        daysOfWeek.add("Friday");
        daysOfWeek.add("Saturday");
        daysOfWeek.add("Sunday");

        // Adding duplicate elements will be ignored
        daysOfWeek.add("Monday");

        System.out.println(daysOfWeek);
    }
}
# Output
[Monday, Thursday, Friday, Sunday, Wednesday, Tuesday, Saturday]

从另一个集合创建一个 HashSet

以下示例显示了如何

  • 使用 HashSet(Collection c) 构造函数从另一个集合创建一个 HashSet。
  • 使用 addAll() 方法将集合中的所有元素添加到 HashSet。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class CreateHashSetFromCollectionExample {
    public static void main(String[] args) {
        List<Integer> numbersDivisibleBy5 = new ArrayList<>();
        numbersDivisibleBy5.add(5);
        numbersDivisibleBy5.add(10);
        numbersDivisibleBy5.add(15);
        numbersDivisibleBy5.add(20);
        numbersDivisibleBy5.add(25);

        List<Integer> numbersDivisibleBy3 = new ArrayList<>();
        numbersDivisibleBy3.add(3);
        numbersDivisibleBy3.add(6);
        numbersDivisibleBy3.add(9);
        numbersDivisibleBy3.add(12);
        numbersDivisibleBy3.add(15);

        // Creating a HashSet from another collection (ArrayList)
        Set<Integer> numbersDivisibleBy5Or3 = new HashSet<>(numbersDivisibleBy5);

        // Adding all the elements from an existing collection to a HashSet
        numbersDivisibleBy5Or3.addAll(numbersDivisibleBy3);

        System.out.println(numbersDivisibleBy5Or3);
    }
}
# Output
[3, 20, 5, 6, 25, 9, 10, 12, 15]

HashSet 简单操作

  • 检查 HashSet 是否为空 |是空的()
  • 求HashSet中的元素个数|尺寸()
  • 检查HashSet中是否存在元素|包含()
import java.util.HashSet;
import java.util.Set;

public class HashSetSimpleOperationsExample {
    public static void main(String[] args) {
        Set<String> popularCities = new HashSet<>();

        // Check if a HashSet is empty
        System.out.println("Is popularCities set empty? : " + popularCities.isEmpty());

        popularCities.add("London");
        popularCities.add("New York");
        popularCities.add("Paris");
        popularCities.add("Dubai");

        // Find the size of a HashSet
        System.out.println("Number of cities in the HashSet " + popularCities.size());

        // Check if the HashSet contains an element
        String cityName = "Paris";
        if(popularCities.contains(cityName)) {
            System.out.println(cityName + " is in the popular cities set.");
        } else {
            System.out.println(cityName + " is not in the popular cities set.");
        }
    }
}
# Output
Is popularCities set empty? : true
Number of cities in the HashSet 4
Paris is in the popular cities set.

从 HashSet 中删除元素

此示例显示如何:

  • 从 HashSet 中删除一个元素。
  • 从 HashSet 中删除给定集合中存在的所有元素。
  • 从 HashSet 中删除满足给定谓词的所有元素。
  • 通过删除所有元素来完全清除 HashSet。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class HashSetRemoveExample {
    public static void main(String[] args) {
        Set<Integer> numbers = new HashSet<>();
        numbers.add(2);
        numbers.add(3);
        numbers.add(4);
        numbers.add(5);
        numbers.add(6);
        numbers.add(7);
        numbers.add(8);
        numbers.add(9);
        numbers.add(10);

        System.out.println("numbers : " + numbers);

        // Remove an element from a HashSet (The remove() method returns false if the element does not exist in the HashSet)
        boolean isRemoved = numbers.remove(10);
        System.out.println("After remove(10) => " + numbers);
        
        // Remove all elements belonging to a given collection from a HashSet
        List<Integer> perfectSquares = new ArrayList<>();
        perfectSquares.add(4);
        perfectSquares.add(9);

        numbers.removeAll(perfectSquares);
        System.out.println("After removeAll(perfectSquares) => " + numbers);

        // Remove all elements matching a given predicate
        numbers.removeIf(num -> num % 2 == 0);
        System.out.println("After removeIf() => " + numbers);

        // Remove all elements from HashSet (clear it completely)
        numbers.clear();
        System.out.println("After clear() => " + numbers);
    }
}
# Output
numbers : [2, 3, 4, 5, 6, 7, 8, 9, 10]
After remove(10) => [2, 3, 4, 5, 6, 7, 8, 9]
After removeAll(perfectSquares) => [2, 3, 5, 6, 7, 8]
After removeIf() => [3, 5, 7]
After clear() => []

迭代HashSet

以下示例显示了迭代 HashSet 的不同方式

  • 使用 Java 8 forEach 和 lambda 表达式迭代 HashSet。
  • 使用 iterator() 迭代 HashSet。
  • 使用 iterator() 和 Java 8 forEachRemaining() 方法迭代 HashSet。
  • 使用简单的 for-each 循环遍历 HashSet。
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class IterateOverHashSetExample {
    public static void main(String[] args) {
        Set<String> programmingLanguages = new HashSet<>();
        programmingLanguages.add("C");
        programmingLanguages.add("C++");
        programmingLanguages.add("Java");
        programmingLanguages.add("Python");
        programmingLanguages.add("PHP");
        programmingLanguages.add("Ruby");

        System.out.println("=== Iterate over a HashSet using Java 8 forEach and lambda ===");
        programmingLanguages.forEach(programmingLanguage -> {
            System.out.println(programmingLanguage);
        });

        System.out.println("=== Iterate over a HashSet using iterator() ===");
        Iterator<String> programmingLanguageIterator = programmingLanguages.iterator();
        while (programmingLanguageIterator.hasNext()) {
            String programmingLanguage = programmingLanguageIterator.next();
            System.out.println(programmingLanguage);
        }

        System.out.println("=== Iterate over a HashSet using iterator() and Java 8 forEachRemaining() method ===");
        programmingLanguageIterator = programmingLanguages.iterator();
        programmingLanguageIterator.forEachRemaining(programmingLanguage -> {
            System.out.println(programmingLanguage);
        });

        System.out.println("=== Iterate over a HashSet using simple for-each loop ===");
        for(String programmingLanguage: programmingLanguages) {
            System.out.println(programmingLanguage);
        }
    }
}
# Output
=== Iterate over a HashSet using Java 8 forEach and lambda ===
Java
C++
C
PHP
Ruby
Python
=== Iterate over a HashSet using iterator() ===
Java
C++
C
PHP
Ruby
Python
=== Iterate over a HashSet using iterator() and Java 8 forEachRemaining() method ===
Java
C++
C
PHP
Ruby
Python
=== Iterate over a HashSet using simple for-each loop ===
Java
C++
C
PHP
Ruby
Python

HashSet 与用户定义的对象

此示例显示如何创建用户定义对象的 HashSet。

import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

class Customer {
    private long id;
    private String name;

    public Customer(long id, String name) {
        this.id = id;
        this.name = name;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    // Two customers are equal if their IDs are equal
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Customer customer = (Customer) o;
        return id == customer.id;
    }

    @Override
    public int hashCode() {
        return Objects.hash(id);
    }

    @Override
    public String toString() {
        return "Customer{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}

public class HashSetUserDefinedObjectExample {
    public static void main(String[] args) {
        Set<Customer> customers = new HashSet<>();
        customers.add(new Customer(101, "Rajeev"));
        customers.add(new Customer(102, "Sachin"));
        customers.add(new Customer(103, "Chris"));

        /* HashSet will use the `equals()` & `hashCode()` implementations of the Customer class to check for duplicates and ignore them */
        customers.add(new Customer(101, "Rajeev"));

        System.out.println(customers);
    }
}
# Output
[Customer{id=101, name='Rajeev'}, Customer{id=102, name='Sachin'}, Customer{id=103, name='Chris'}]

结论

恭喜各位!在本文中,您了解了什么是 HashSet、如何创建 HashSet、如何向 HashSet 添加元素、如何从 HashSet 中删除元素、如何检查 HashSet 中是否存在元素、如何迭代 HashSet ,以及如何创建用户定义对象的 HashSet。

相关文章