HashSet 与 LinkedHashSet

2025 年 3 月 27 日 | 阅读 5 分钟

HashSet 是 Java 集合框架中的一个类,用于创建使用哈希表存储对象的集合。相比之下,LinkedHashSet 类与 HashSet 类似。此外,它还维护插入顺序。

HashSet 继承了 AbstractSet 类的属性并实现了 Set 接口。LinkedHashSet 继承了 HashSet 类并实现了 Set 接口。

HashSet

HashSet 是一个实现了 Set 接口的类。它用于将对象存储在哈希表中;哈希表是一种数据结构,它将数据存储在 ArrayList 中。它通过数组索引提供对数据的快速访问。我们可以使用 HashSet 轻松地插入、更新和删除元素。

以下是 HashSet 类的一些特性:

  • HashSet 使用一种称为“哈希”的机制来存储元素。
  • 它使用哈希表数据结构来存储元素。
  • 它包含唯一的元素。
  • 它允许存储 null 值。
  • 它是一个非同步类。
  • 它不提供维护插入顺序的机制。因此,元素将根据哈希码插入。
  • 它是搜索操作的有用机制。
  • 默认情况下,它使用 16 作为哈希表的初始大小。
  • 它扩展了 AbstractSet 类并实现了 Set 接口。
  • 它还实现了 Cloneable 和 Serializable 接口。

声明

HashSet 类可以声明如下:

请考虑以下示例以了解 HashSet 的行为:

输出

Apple
Cat
Elephant
Dog
Banana

从上面的示例中,我们可以看到元素存储在无序集合中。

LinkedHashSet

LinkedHashSet 类与 HashSet 类非常相似;它是 HashSet 的有序版本。此外,它允许我们维护元素的插入顺序。它继承了 HashSet 类并实现了 Set 接口。它还使用哈希表来存储元素。它允许我们轻松地插入、更新、删除和维护元素。

以下是 LinkedHashSet 的一些特性:

  • 它包含唯一的元素。
  • 它使用哈希表和双向链表来存储和维护元素。
  • 它可以包含 null 元素。
  • 它提供了集合操作的选项。
  • 它是非同步的。
  • 它提供了一种简单的方式来维护插入顺序。

声明

LinkedHashSet 类可以声明如下:

请考虑以下示例以了解 LinkedHashSet 的行为:

输出

A
B
C
D
E

从上面的示例中,我们可以看到元素按插入顺序进行迭代。

HashSet 和 LinkedHashSet 之间的区别

以下是 HashSet 和 LinkedHashSet 之间的一些关键区别:

  • HashSet 是无序且未排序的数据集集合,而 LinkedHashSet 是 HashSet 的有序且排序的集合。
  • HashSet 不提供任何维护插入顺序的方法。相比之下,LinkedHashSet 维护元素的插入顺序。
  • 我们无法预测 HashSet 中的插入顺序,但我们可以预测 LinkedHashSet 中的插入顺序。
  • LinkedHashSet 扩展了 HashSet,因此它使用哈希表来存储元素。此外,它使用双向链表来维护插入顺序。
  • HashSet 和 LinkedHashSet 都实现了 Set 接口。
  • HashSet 比 LinkedHashSet 稍快。但两者都提供几乎相似的性能。
  • 两者都提供 o(1) 的复杂性用于插入、删除、检索对象。
  • HashSet 和 LinkedHashSet 都只允许一个 null 对象。
  • LinkedHashSet 比 HashSet 需要更多的内存。
  • HashSet 在 Java 2 中引入,而 LinkedHashSet 在 Java 4 中引入。

请考虑以下 HashSet 和 LinkedHashSet 之间的表格差异:

属性HashSetLinkedHashSet
数据结构它使用哈希表来存储元素。它使用哈希表和双向链表来存储和维护元素的插入顺序。
存储元素的技术哈希哈希
插入顺序它不提供任何插入顺序。我们无法预测元素的顺序。它提供插入顺序;我们可以预测元素的顺序。
Null 元素它只允许一个 null 元素。它也只允许一个 null 元素。
内存它需要更少的内存。它比 HashSet 需要更多的内存。
性能它提供的性能略高于 LinkedHashSet。它提供的性能低于 HashSet。
同步非同步非同步
插入、删除、检索操作的复杂度O (1)O (1)
声明HashSet obj = new HashSet();LinkedHashSet obj = new LinkedHashSet();
扩展AbstractSet 类HashSet 类
实现Set 接口Set 接口
初始容量1616
java.utilJava.util

何时使用 HashSet 和 LinkedHashSet

如果我们需要维护插入顺序,那么 LinkedHashSet 会很有用。但是,当维护元素的插入顺序不是我们的优先事项时,HashSet 会很有用,并提供更好的性能。

总结

正如我们已经讨论了 Java 集合框架中的 HashSet 和 LinkedHashSet 类,为本次讨论做一个最后的总结,我们想说这两个数据结构都非常有用,并使用相似的实现技术(哈希)。但是,如果您有一个不需要插入顺序的小型项目,我们建议使用 HashSet,因为它比 LinkedHashSet 提供更好的性能。如果您想预测插入顺序,那么建议使用 LinkedHashSet,因为它使用双向链表来维护元素顺序,并提供简单的搜索过程。