List 和 ArrayList 的区别

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

Java 集合提供了一个处理对象组的架构。集合是指对象的单个单元。它允许我们将对象组作为一个单元进行存储和操作。

使用集合框架,我们可以轻松地对一组对象执行许多操作,例如搜索、排序、插入、删除和操作。

Java 集合框架提供了多种接口和类。接口包括Set、List、Queue、Deque,类包括ArrayListVectorLinkedListHashSetTreeSetLinkedHashSetPriorityQueue

在本节中,我们将区分集合框架中的两个元素:List 和 ArrayList。List 是一个接口,ArrayList 是一个类。

Difference between List and ArrayList

List 接口

List 是集合框架的一个子接口,它允许我们维护对象的有序集合。我们可以使用 List 存储重复值和 null 元素。它提供了基于索引的方法来对对象执行插入、删除、搜索、更新操作。

List 接口属于 java.util 包。它实现了 ArrayList、LinkedList、Stack 和 Vector 类。它也是 ListIterator 接口的基础,通过它可以双向迭代 List。

List 接口提供位置访问和插入元素,并保留插入顺序。List 的实例可以通过实现类创建。

以下是关于 List 的一些关键点

抽象性质: List 是一个抽象类型;这意味着我们不能直接实例化它。相反,我们使用它的实现,如 ArrayList、LinkedList、Vector 和 Stack。

方法: List 接口提供了各种方法,如 add()、get()、remove()、set()、size()、subList() 和 contains()。这些方法有助于对列表元素执行不同的操作。

灵活性: 作为一个接口,List 允许在选择底层数据结构方面具有灵活性。根据具体需求,我们可以在不更改使用 List 的代码的情况下,在不同的实现之间切换。

List 的实现

我们可以使用 ArrayList、LinkedList、Vector 和 Stack 类来实现 List 接口。

要实例化 List 接口,可以使用以下语法

考虑以下 List 示例

文件名:JavaListExample.java

输出

[Hello, Java, Tpoint]

ArrayList 类

ArrayList 类使用动态数组来存储元素。ArrayList 类的工作方式类似于数组,但它没有大小限制。我们可以根据需要添加或删除元素。我们可以使用 ArrayList 类存储重复元素。它在内部管理插入顺序。

ArrayList 类比传统数组灵活得多。它实现了 List 接口以使用 List 接口的所有方法。它位于 Java.util 包中。

ArrayList 类继承了 AbstractList 类并实现了 List 接口。它的元素可以随机访问。它不能用于基本类型,如 int、char 等;对于这些数据类型,我们需要包装类。

以下是 ArrayList 的一些关键特性

可调整大小: 与数组不同,ArrayList 在添加或删除元素时可以动态地增长和缩小。这种动态调整大小由 ArrayList 在内部处理。

性能: ArrayList 在按索引访问元素时提供 O(1) 的常数时间复杂度,使其成为需要快速访问的场景的首选。但是,添加或删除元素(尤其是在中间)可能会很昂贵 O(n),因为需要移动元素。

初始容量: 创建 ArrayList 时,它具有初始容量。如果添加的元素超过初始容量,ArrayList 会通过重新分配内部数组自动增加其大小,这可能是一项昂贵的操作。

线程安全: ArrayList 不是同步的,这意味着它不是线程安全的。如果多个线程并发访问 ArrayList,并且至少有一个线程在结构上修改它,则必须在外部进行同步。

ArrayList 的实现

ArrayList 类继承了 AbstractList 类中的所有方法并实现了 List 接口。

ArrayList 类可以声明如下

ArrayList 可以定义如下

考虑以下 ArrayList 类的示例。

文件名:JavaAL.java

输出

[Hello, Java, Tpoint]

List 接口和 ArrayList 类之间的一些关键区别

类型

  • List: 一个接口。
  • ArrayList: 一个实现 List 接口的具体的类。

实例化

  • List: 不能直接实例化。示例

当我们这样定义 List 时

这意味着我们只能调用 List 接口中的方法和引用成员。

  • ArrayList: 可以直接实例化。示例

如果我们这样定义 ArrayList 时

这意味着我们可以调用 ArrayList 中可用的方法并使用其成员,此外还可以使用 List。

灵活性

  • List: 它可以引用实现 List 接口的任何类,从而灵活地切换实现。
  • ArrayList: 特定于可调整大小的数组实现。

性能

  • 访问时间: 两者都提供 O(1) 的访问时间。
  • 插入/删除: ArrayList 在中间插入和删除可能较慢 (O(n)),而 LinkedList(另一个 List 实现)提供 O(1) 的这些操作,但访问需要 O(n)。

同步

  • List: 作为一个接口,它不提供同步。
  • ArrayList: 默认情况下不同步,但可以使用 Collections.synchronizedList(new ArrayList<>()) 使其线程安全。

请看下表,了解 List 和 ArrayList 的一些主要比较

比较基础列表ArrayList
常规它是一个接口。它是一个类。
工作它创建一个对象列表,可以通过单个索引号进行访问。它创建一个动态数组,可以在需要时进行扩展。
实施List <数据类型> list1 = new ArrayList();ArrayList myList = new ArrayList();
扩展/实现它扩展了集合框架。它扩展了 AbstractList 类并实现了 List 接口。
基础包Java.utilJava.util
命名空间System.Collection.GenericSystem.Collection
性能它提供了更快的对象操作。与 List 相比,它提供了较慢的对象操作。
实例化它不能被实例化。它可以被实例化

如何选择?

使用 List 的情况

  • 我们需要灵活性,可以在不更改客户端代码的情况下在不同的 List 实现之间切换。
  • 我们想编写更通用和可重用的代码。

使用 ArrayList 的情况

  • 我们需要快速随机访问元素。
  • 我们主要在列表的末尾添加或删除元素。
  • 我们在单线程环境中使用,或者在多线程环境中需要时可以进行外部同步。

结论

List 是一个接口,ArrayList 是 Java 集合框架的一个类。List 创建一个静态数组,而 ArrayList 创建一个动态数组来存储对象。因此,List 在创建后无法扩展,但使用 ArrayList,我们可以根据需要扩展数组。

如果您想利用多态性的优势,最好使用 List 接口。将来,如果需要实现该接口,我们将无需更改程序。


下一个主题Multivaluemap-in-java