Java 中 List 和 Set 的区别

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

JDK 2.0 中,我们使用 VectorArrayHashtable 将对象分组为一个单元。在 JDK 8 中,Collection 框架应运而生,它提供了几个接口来处理数据集合。List 和 Set 接口是其中之一,用于分组对象。这两个接口都扩展了 Collection 接口。ListSet 之间的主要区别在于 Set 是无序的且包含不同的元素,而 List 是有序的并且可以包含相同的元素。让我们详细讨论。

List 接口

java.util 包提供了 List 接口来维护有序集合。List 可以包含 null 和重复值。List 的方法基于索引,因此所有操作(如插入、删除、更新和搜索)都基于索引。ArrayListLinkedListStackVector 是 List 接口中提供的实现类。在 Java 中,我们主要使用 ArrayList 和 LinkedList 实现类来设计列表。

除了 List 接口提供的基本功能,如维护有序集合以及允许 null 和重复值之外,需要注意的是,List 还提供了强大的方法来基于元素的索引进行操作和遍历。这种基于索引的方法可以高效地进行列表中的插入、删除、更新和搜索等操作。此外,Java.util 包为 List 接口提供了多种实现类,每种都针对特定的用例进行了优化。

  1. ArrayList:此实现提供动态数组,可以随着元素的添加或删除动态调整大小,使其成为需要快速访问和迭代场景的理想选择。
  2. LinkedList:与 ArrayList 不同,LinkedList 实现了一个双向链表,在列表的两端都提供了高效的插入和删除操作,尽管与 ArrayList 相比,访问任意元素的时间可能会更慢。
  3. Stack:Stack 是 Vector 的一个子类,表示一个后进先出(LIFO)数据结构。它提供了 push() 和 pop() 等额外方法来支持堆栈操作。
  4. Vector:与 ArrayList 类似但经过同步处理,Vector 是一个遗留类,提供线程安全的元素访问,但性能略低于 ArrayList。

让我们在 Java 程序中使用 List 接口。

ListExample.java

输出

Difference Between List and Set in Java

解释

提供的 Java 代码展示了如何使用 List 接口,特别是如何使用 ArrayList 实现。首先,'names' 是创建的 String 列表的名称。然后使用 add() 方法向此列表添加元素(“Emma”、“Adele”、“Aria”和“Ally”)。最后,使用 for-each 循环遍历列表中的每个元素并将其打印到控制台。此代码演示了在 Java 中处理列表可以多么简单高效,从而可以轻松存储、检索和操作数据集合。

Set 接口

Set 接口属于 java.util 包,它扩展了 Collection 接口。它限制我们输入重复值。它以排序方式存储值,因此不维护插入顺序。Set 接口用于在 Java 中设计数学上的 Set。

Set 实现通过使用 hashCode() 方法进行有效存储和检索,并使用 equals() 方法确定相等性来确保没有重复元素。某些 Set 实现(如 TreeSet)由于其排序结构,能够以升序进行快速的元素遍历和搜索。Set 接口的数学集合特性是其流行的另一个原因;它们使开发人员能够快速执行集合操作,如交集、并集、差集和子集测试。此外,TreeSet 为需要有序组件的应用程序提供排序 Set 功能,而 HashSet 和 LinkedHashSet 是流行的 Set 实现,在不需要保留插入顺序的情况下提供了出色的性能。

让我们看一个示例来理解如何在 Java 中创建 Set。

SetExample.java

输出

Difference Between List and Set in Java

解释

提供的 Java 代码演示了如何使用 Set 接口,特别是如何使用 HashSet 实现。首先,使用 HashSet 实例化一个名为 'veg' 的 Set。然后,将蔬菜名称(“Ginger”、“Garlic”、“Onion”和“Ginger”再次)添加到此列表中。但是,由于 Set 本质上是唯一的,重复的元素会被自动删除,留下一个只包含唯一元素的集合。最后通过打印 Set 的内容到控制台,展示了 Java 中 HashSet 等 Set 实现所强制执行的唯一性约束。

List 与 Set 接口的对比

在 Java 中,List 和 Set 都存在于 Collection 框架中。为了将对象集合存储为一个单元,使用 Set 和 List 接口。除了这些相似之处,这两个接口也有很多区别,如下所示:

序号列表Set
1.List 实现允许我们添加相同或重复的元素。Set 实现不允许我们添加相同或重复的元素。
2.List 维护插入顺序。它不维护元素的插入顺序。
3.List 允许我们添加任意数量的 null 值。Set 允许我们至少添加一个 null 值。
4.List 的实现类是 LinkedList 和 ArrayList。Set 的实现类是 TreeSet、HashSet 和 LinkedHashSet。
5.我们可以使用 get() 方法从列表中获取指定索引的元素。我们无法根据索引从 Set 中查找元素,因为它不提供任何 get() 方法。
6.当我们需要通过索引频繁访问元素时使用。当我们需要设计一组不重复的元素时使用。
7.List 接口的 listiterator() 方法用于迭代 List 元素。当我们需要迭代 Set 元素时使用迭代器。
8.它支持通过索引进行位置访问。它不支持位置访问。
9.实现有序集合。它实现无序集合。
10.它允许通过索引高效地检索元素。它的检索基于元素相等性。
11.它支持在特定索引处添加、删除和替换等操作。它不支持此类操作。
12.它通常使用动态数组或链表数据结构。它利用哈希表或基于树的数据结构。
13.它允许调整大小和动态增长。它的容量通常是固定的或有限的。
14.ListIterator 允许在迭代过程中进行双向遍历和修改。Iterator 提供顺序遍历而不进行修改。
15.它通常用于需要带有重复项的有序集合的场景。它非常适合需要唯一性和集合操作的场景。

下一主题Java-web-services