# `HashSet`和`HashMap`之间的区别

> 原文： [https://beginnersbook.com/2014/08/hashset-vs-hashmap-java/](https://beginnersbook.com/2014/08/hashset-vs-hashmap-java/)

在本文中，我们将讨论[`HashSet`](https://beginnersbook.com/2013/12/hashset-class-in-java-with-example/)和[`HashMap`](https://beginnersbook.com/2013/12/hashmap-in-java-with-example/)类之间的差异。

## `HashSet` vs `HashMap`

**差异：**

| `HashSet` | `HashMap` |
| --- | --- |
| `HashSet`类实现`Set`接口 | `HashMap`类实现了`Map`接口 |
| 在`HashSet`中，我们存储对象（元素或值），例如如果我们有一个字符串元素的`HashSet`，那么它可以描述一组`HashSet`元素：`{"Hello", "Hi", "Bye", "Run"}` | `HashMap `于存储键值对。简而言之，它保持了键和值的映射。（`HashMap`类大致相当于`Hashtable`，除了它是不同步的并且允许空值。）如果`HashMap`元素具有整数键和`String`类型的值，则可以表示`HashMap`元素：`{1->"Hello", 2->"Hi", 3->"Bye", 4->"Run"}` |
| `HashSet`不允许重复元素，这意味着您无法在`HashSet`中存储重复值。 | `HashMap`不允许重复键，但它允许重复值。 |
| `HashSet`允许具有单个空值。 | `HashMap`允许单个`null`键和任意数量的空值。 |

**相似之处：**

1）`HashMap`和`HashSet`都不同步，这意味着它们不适合线程安全操作`unitl`，除非明确同步。这是你可以明确地同步它们的方法：

`HashSet`：

```java
Set s = Collections.synchronizedSet(new HashSet(...));
```

`HashMap`：

```java
 Map m = Collections.synchronizedMap(new HashMap(...));
```

2）这两个类都不保证其元素的顺序会随着时间的推移保持不变。

3）如果查看`HashSet`的源代码，您可能会发现它由`HashMap`备份。所以基本上它在内部使用`HashMap`进行所有操作。

4）它们都为基本操作提供恒定的时间性能，例如添加，删除元素等。

#### `HashSet`示例

```java
import java.util.HashSet;
class HashSetDemo{ 
  public static void main(String[] args) {
     // Create a HashSet
     HashSet<String> hset = new HashSet<String>();

     //add elements to HashSet
     hset.add("AA");
     hset.add("BB");
     hset.add("CC");
     hset.add("DD");

     // Displaying HashSet elements
     System.out.println("HashSet contains: ");
     for(String temp : hset){
        System.out.println(temp);
     }
  }
}
```

**输出：**

```java
HashSet contains: 
AA
BB
CC
DD

```

#### `HashMap`示例

```java
import java.util.HashMap;
class HashMapDemo{ 
  public static void main(String[] args) {
     // Create a HashMap
     HashMap<Integer, String> hmap = new HashMap<Integer, String>();

     //add elements to HashMap
     hmap.put(1, "AA");
     hmap.put(2, "BB");
     hmap.put(3, "CC");
     hmap.put(4, "DD");

     // Displaying HashMap elements
     System.out.println("HashMap contains: "+hmap);
  }
}
```

**输出：**

```java
HashMap contains: {1=AA, 2=BB, 3=CC, 4=DD}

```

#### 参考：

[`HashSet` javadoc](https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html)
[`HashMap` javadoc](https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html)