Java 中 Set 和 Map 的区别

2025 年 3 月 31 日 | 6 分钟阅读

在 Java 中,SetMap 是集合框架中两个重要的接口。Set 和 Map 接口都用于将对象集合存储为单个单元。SetMap 的主要区别在于,Set 是无序的且包含不同的元素,而 Map 以键值对的形式存储数据。

在本节中,我们将详细讨论 Set 和 Map 接口,并研究它们的区别。

Set 接口

java.util 包 提供了 Set 接口,该接口通过扩展 Collection 接口来实现。Set 不允许我们向其中添加相同的元素,并且它不维护插入顺序,因为它以排序的方式包含元素。在 Java 中,我们使用 Set 接口来设计数学上的集合。

特点

  • 唯一性:它自动阻止重复条目。
  • 无索引访问:与列表不同,Set 不提供通过索引访问元素的方法。
  • 空元素:它可以包含一个空元素(在 HashSet 和 LinkedHashSet 中)。

实现

  • HashSet:它为基本操作提供常数时间性能,但不维护任何顺序。
  • LinkedHashSet:它维护插入顺序,性能略低于 HashSet。
  • TreeSet:它实现 NavigableSet 并按自然或自定义顺序保持元素排序。
Set vs Map in Java

让我们在 Java 程序中实现 Set 接口。

SetExample.java

输出

Set vs Map in Java

说明

提供的 Java 代码演示了使用 LinkedHashSet 来存储 Marvel 电影宇宙中唯一的电影标题集合。SetExample 类包含一个 main 方法,作为程序的入口点。在 main 方法内部,创建了一个名为 marvel_movies 的 LinkedHashSet,类型为 String。

此处选择 LinkedHashSet 以保持元素的插入顺序,确保电影按照添加的顺序打印。然后,代码使用 add() 方法向 marvel_movies 集合中添加了四个电影标题。由于 Set 的实现不允许重复元素,任何尝试添加重复电影标题的操作都将被忽略,但此特定示例中未显示此情况。最后,将 marvel_movies 集合打印到控制台,显示按添加顺序排列的电影标题列表。

Map 接口

Map 是 Collection 接口中另一个重要的接口。因此,为了使用 Map 接口,我们必须扩展 Collection 接口。就像 Set 一样,Map 也用于将对象集合存储为单个单元。每个对象都以键值对的形式存储。我们可以轻松地使用键来访问值,因为每个值都与一个唯一的值关联。

我们可以使用 Map 轻松地搜索、更新或删除元素。MapSortedMap 是两个接口,而 TreeMapLinkedHashMapHashMap 是 Map 的三个类。

如果我们需要遍历 Map,我们必须将其转换为 Set,因为 Map 不能遍历。转换为 Set 后,我们可以使用 Set 的方法(如 keySet()entrySet())来遍历它。

Set vs Map in Java

特点

  • 键值映射:每个键映射到正好一个值。
  • 唯一键:没有两个键可以相同,但值可以重复。
  • 空键和空值:根据实现的不同,可能允许空键和空值(HashMap 允许一个空键和多个空值)。

实现

  • HashMap:为基本操作提供常数时间性能,并允许一个空键和多个空值。不维护顺序。
  • LinkedHashMap:维护键的插入顺序,并提供可预测的迭代顺序。
  • TreeMap:实现 NavigableMap 并按自然或自定义顺序保持键排序。

让我们通过一个例子来了解如何在 Java 中创建 Map。

MapExample.java

输出

Set vs Map in Java

说明

提供的 Java 代码演示了使用 LinkedHashMap 来存储和管理学生记录集合,其中每条记录都包含学生 ID 作为键,学生姓名作为值。MapExample 类包含一个 main() 方法,它是程序的入口点。在 main 方法内部,创建了一个类型为 且名为 students 的 LinkedHashMap,确保条目将保持其插入顺序。

然后,代码使用 put 方法向 students 映射中添加了五条学生记录,该方法将指定的键值对插入到映射中。程序使用 size 方法打印学生映射的大小并显示映射的内容。然后,它使用 containsKey() 方法检查映射中是否存在特定键 (105)。如果找到键,则使用 get 方法检索相应的值(学生姓名)并将其打印到控制台。

Set 和 Map 接口的区别

两个接口都用于将对象集合存储为单个单元。Set 和 Map 的主要区别在于,Set 只包含数据元素,而 Map 包含键值对形式的数据,因此 Map 包含键及其值。

现在,让我们了解它们之间的一些主要区别。

序号SetMap
1.Set 用于在 Java 中构建数学集合。Map 用于在数据库中进行映射。
2.它不能包含重复值。它对于不同的键可以具有相同的值。
3.Set 不允许我们向其中添加相同的元素。实现 Set 接口的每个类只包含唯一值。Map 包含唯一的键和重复的值。在 Map 中,一个或多个键可以具有相同的值,但两个键不能相同。
4.我们可以使用它的 keyset() 和 entryset() 方法轻松迭代 Set 元素。Map 元素无法迭代。我们需要将 Map 转换为 Set 才能迭代元素。
5.Set 接口不维护插入顺序。但是,它的一些类,如 LinkedHashSet,维护插入顺序。Map 也不维护插入顺序。但是,一些 Map 类,如 TreeMap 和 LinkedHashMap,会这样做。
6.常见的实现包括 HashSet、LinkedHashSet 和 TreeSet。常见的实现包括 HashMap、LinkedHashMap 和 TreeMap。
7.不支持键值对,只支持单个元素。支持键值对,将唯一键与值关联。
8.适用于需要唯一元素集合的场景。适用于需要根据唯一键检索值的场景。
9.Set 操作包括 add、remove、contains 和 size。Map 操作包括 put、get、remove、containsKey、containsValue 和 size。
10.addAll()、retainAll() 和 removeAll() 等方法允许对集合进行批量操作。putAll() 等方法允许批量操作以从另一个映射复制映射。
11.不提供根据索引或键获取元素的方法。提供根据键获取元素的方法(get(key) 方法)。
12. 由于其结构更简单,通常用于检查元素是否存在时速度更快。通常需要更多开销来维护键值对结构,但针对基于键的检索进行了优化。
13.适用于涉及并集、交集和差集等集合操作的场景。适用于涉及查找操作的场景,您需要根据键快速查找值。

结论

总而言之,Set 和 Map 是 Java Collections Framework 的基本元素,它们实现不同的功能。Set 通常用于需要避免重复组件的情况。Set 非常适合存储唯一元素,并且具有与数学集合相似的特性。其各种实现(例如 HashSet、LinkedHashSet 和 TreeSet)提供了不同的排序保证和性能特性。