# Java `HashSet`教程

原文：http://zetcode.com/java/hashset/

Java `HashSet`教程显示了如何使用 Java `HashSet`集合。

## Java `HashSet`

`HashSet`是一个不包含重复元素的集合。 此类为基本操作（添加，删除，包含和调整大小）提供恒定的时间性能。 `HashSet`不提供元素的排序。 `HashSet`没有用于检索元素的`get()`方法。

`HashSet`实现`Set`接口。 `Set`是一个没有重复的集合。 该接口对数学集合抽象进行建模。

## Java `HashSet`构造器

*   `HashSet()` - 构造一个默认的空集。
*   `HashSet(int initialCapacity)` - 使用给定的初始容量构造一个新的空集。 当元素添加到`HashSet`时，容量会自动增长。
*   `HashSet(int initialCapacity, float loadFactor)` - 使用给定的初始容量和负载因子构造一个新的空集。
*   `HashSet(Collection<? extends E> c)` - 构造一个新集合，其中包含指定集合的​​元素。

`E`是元素的类型。

## Java `HashSet`方法

下表提供了几种`HashSet`方法。

| 修饰符和类型 | 方法 | 描述 |
| --- | --- | --- |
| `void` | `clear()` | 从集合中删除所有元素。 |
| `Object` | `clone()` | 返回`HashSet`实例的浅表副本：元素本身未克隆。 |
| `boolean` | `contains(Object o)` | 集合为空，则返回`true`。 |
| `boolean` | `add(E e)` | 如果指定的元素尚不存在，则将其添加到该集合中。 |
| `boolean` | `remove(Object o)` | 从该集合中删除指定的元素（如果存在）。 |
| `boolean` | `removeAll(Collection<?> c)` | 从该集合中删除指定集合中包含的所有元素。 |
| `Iterator<E>` | `iterator()` | 返回此集合中元素的迭代器。 |
| `int` | `size()` | 返回此集合中的元素数。 |

在本教程中，我们将使用其中的几种方法。

## Java `HashSet`创建

用`new`关键字创建`HashSet`。

```java
Set<String> brands = new HashSet<>();

```

尖括号之间的元素类型。 由于类型推断，因此不必在声明的右侧提供类型。

## Java `HashSet`添加元素

`add()`方法用于将元素添加到集合中。

```java
brands.add("Pepsi");

```

参数是要添加到集合中的元素。

## Java `HashSet`确定容量

`size()`方法返回集合中的元素数。

```java
int nOfElements = brands.size();

```

## Java `HashSet`示例 I

下面的示例创建一个`HashSet`，确定其大小，并将所有元素打印到控制台。

`HashSetSize.java`

```java
package com.zetcode;

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

public class HashSetSize {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("IBM");
        brands.add("IBM");

        int nOfElements = brands.size();

        System.out.format("The set contains %d elements%n", nOfElements);
        System.out.println(brands);
    }
}

```

在代码示例中，我们创建了一个品牌`HashSet`。 每个品牌都必须是唯一的。 例如，不能有两个 IBM 公司注册。

```java
brands.add("IBM");
brands.add("IBM");

```

甚至以为我们尝试两次添加一个品牌，但一组仅包含一个 IBM 品牌。

```java
int nOfElements = brands.size();

```

我们确定`brands`集的大小。

```java
System.out.println(brands);

```

所有元素都将打印到控制台。

```java
The set contains 4 elements
[Nike, Volvo, IBM, Wilson]

```

这是示例的输出。

## Java `HashSet isEmpty()`

`isEmpty()`方法检查集合中是否包含任何元素。

```java
brands.isEmpty();

```

参数是要从此集中删除的对象（如果存在）。

## Java `HashSet`删除元素

可以使用`remove()`和`removeAll()`方法删除`HashSet`中的元素。

```java
brands.remove("Pepsi");

```

`remove()`方法从集中删除指定的元素（如果存在）。

```java
brands.removeAll(collection);

```

使用`removeAll()`，可以从`HashSet`中删除参数集合中包含的所有元素。

## Java `HashSet`示例 II

在下面的示例中，我们介绍`add()`，`remove()`，`removeAll()`和`isEmpty()`方法。

`HashSetRemove.java`

```java
package com.zetcode;

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

public class HashSetRemove {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("Kia");
        brands.add("Lenovo");

        Set<String> brands2 = new HashSet<>();

        brands2.add("Wilson");
        brands2.add("Nike");
        brands2.add("Volvo");

        System.out.println(brands);

        brands.remove("Kia");
        brands.remove("Lenovo");

        System.out.println(brands);

        brands.removeAll(brands2);

        System.out.println(brands);

        if (brands.isEmpty()) {

            System.out.println("The brands set is empty");
        }        
    }
}

```

该示例构建品牌的`HashSet`并从中删除元素。

```java
System.out.println(brands);

```

初始`HashSet`被打印到控制台。

```java
brands.remove("Kia");
brands.remove("Lenovo");

System.out.println(brands);

```

我们用`remove()`删除两个元素，并将`brands`的内容打印到控制台。

```java
brands.removeAll(brands2);

System.out.println(brands);

```

最后，我们从第一组中删除第二组中包含的所有元素。

```java
if (brands.isEmpty()) {

    System.out.println("The brands set is empty");
}

```

如果`brands`设置为空，我们将向终端打印一条消息。

```java
[Nike, Lenovo, Kia, Volvo, Wilson]
[Nike, Volvo, Wilson]
[]
The brands set is empty

```

This is the output of the example.

## Java `HashSet clear()`

`clear()`方法从集合中删除所有元素。

```java
brands.clear();

```

该方法没有参数。

## Java `HashSet contains()`

如果集合包含指定的元素，则`contains()`方法返回`true`。

```java
brands.contains("Volvo");

```

参数是要测试其是否存在于该集合中的元素。

## Java `HashSet`示例 III

在下面的示例中，我们使用`add()`，`contains()`，`clear()`和`isEmpty()`方法。

`HashSetContains.java`

```java
package com.zetcode;

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

public class HashSetContains {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("Kia");
        brands.add("Lenovo");

        if (brands.contains("Wilson")) {

            System.out.println("The set contains the Wilson element");
        } else {

            System.out.println("The set does not contain the Wilson element");
        }

        if (brands.contains("Apple")) {

            System.out.println("The set contains the Apple element");
        } else {

            System.out.println("The set does not contain the Apple element");
        }

        brands.clear();

        if (brands.isEmpty()) {

            System.out.println("The set does not contain any elements.");
        }        

    }
}

```

在示例中，我们检查集合中是否存在两个元素。

```java
if (brands.contains("Wilson")) {

    System.out.println("The set contains the Wilson element");
} else {

    System.out.println("The set does not contain the Wilson element");
}

```

我们检查集合中是否存在`"Wilson"`品牌，并相应地打印一条消息。

```java
The set contains the Wilson element
The set does not contain the Apple element
The set does not contain any elements.

```

This is the output of the example.

## Java `HashSet`迭代与`forEach()`

我们使用 Java8 `forEach()`方法来迭代`HashSet`的元素。 `forEach()`方法对集合中的每个元素执行给定的操作，直到所有元素都已处理或该操作引发异常。

`HashSetForEach.java`

```java
package com.zetcode;

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

public class HashSetForEach {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("Kia");
        brands.add("Lenovo");

        brands.forEach(e -> System.out.println(e));
    }
}

```

使用`forEach()`方法，我们遍历该集合并将其元素打印到控制台。

## 使用迭代器的 Java `HashSet`迭代

迭代器是用于迭代集合的对象。 使用`iterator()`检索迭代器。

`HashSetForEach.java`

```java
package com.zetcode;

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

public class HashSetIterator {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("Kia");
        brands.add("Lenovo");

        Iterator<String> it = brands.iterator();

        while (it.hasNext()) {

            String element = it.next();

            System.out.println(element);
        }
    }
}

```

该代码示例遍历`HashSet`的所有元素，并将它们打印到控制台。

## Java 使用增强的`for`循环迭代`HashSet`

Java 5 中引入的增强的`for`循环可用于对`HashSet`进行迭代。

`HashSetEnhancedFor.java`

```java
package com.zetcode;

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

public class HashSetEnhancedFor {

    public static void main(String[] args) {

        Set<String> brands = new HashSet<>();

        brands.add("Wilson");
        brands.add("Nike");
        brands.add("Volvo");
        brands.add("Kia");
        brands.add("Lenovo");      

        for (String brand: brands) {

            System.out.println(brand);
        }
    }
}

```

在该示例中，我们迭代具有增强的`for`循环的`HashSet`。

```java
for (String brand: brands) {

    System.out.println(brand);
}

```

在每个`for`循环中，将一个新元素分配给`brand`变量。

在本教程中，我们介绍了 Java `HashSet`集合。 您可能也对相关教程感兴趣：[Java `HashMap`教程](/java/hashmap/)，[Java `ArrayList`教程](/articles/javaarraylist/)，[Java `static`关键字](/java/statickeyword/)，[Java 中的`HashMap`迭代](/java/hashmapiterate/) ，[Java8 `forEach`教程](/articles/java8foreach/)，[用 Java 读取文本文件](/articles/javareadtext/)，[用 Java 读写 ICO 图像](/articles/javaico/)，[Java 教程](/lang/java/)和[用 Java 显示图像](/java/displayimage/)。