Java List

2025年4月1日 | 阅读9分钟

Java 是一种多功能且广泛使用的编程语言,提供了一套强大的数据结构来有效处理对象的集合。Java 中基本的数据结构之一是 List 接口,它提供了一个带有动态大小的有序元素集合。它是 Java 集合框架的一部分,提供了一种多功能且有序的方式来处理元素集合。在本节中,我们将探讨与 Java List 相关的特性、实现和最佳实践。

Java 中的 List 提供了维护有序集合的功能。它包含基于索引的方法来插入、更新、删除和搜索元素。它也可以包含重复元素。我们还可以在列表中存储 null 元素。

List 接口位于 java.util 包中,并继承自 Collection 接口。它是 ListIterator 接口的工厂。通过 ListIterator,我们可以向前和向后迭代列表。List 接口的实现类是 ArrayList、LinkedList、Stack 和 Vector。ArrayList 和 LinkedList 在 Java 编程中广泛使用。Vector 类自 Java 5 以来已被弃用。

List 接口声明

Java List 类方法

方法描述
void add(int index, E element)它用于在列表的指定位置插入指定元素。
boolean add(E e)它用于将指定元素添加到列表的末尾。
boolean addAll(Collection<? extends E> c)它用于将指定集合中的所有元素添加到列表的末尾。
boolean addAll(int index, Collection<? extends E> c)用于将指定集合中的所有元素添加到列表的指定位置。
void clear()它用于从该列表中删除所有元素。
boolean equals(Object o)它用于将指定对象与列表中的元素进行比较。
int hashcode()它用于返回列表的哈希码值。
E get(int index)它用于从列表的特定位置获取元素。
boolean isEmpty()如果列表为空,则返回 true,否则返回 false。
int lastIndexOf(Object o)它用于返回此列表中指定元素最后一次出现的索引,如果列表不包含此元素,则返回 -1。
Object[] toArray()它用于返回一个数组,其中包含此列表中所有元素的正确顺序。
<T> T[] toArray(T[] a)它用于返回一个数组,其中包含此列表中所有元素的正确顺序。
boolean contains(Object o)如果列表包含指定元素,则返回 true
boolean containsAll(Collection<?> c)如果列表包含所有指定元素,则返回 true
int indexOf(Object o)它用于返回此列表中指定元素第一次出现的索引,如果列表不包含此元素,则返回 -1。
E remove(int index)它用于删除列表中指定位置的元素。
boolean remove(Object o)它用于删除指定元素第一次出现的实例。
boolean removeAll(Collection<?> c)它用于从列表中删除所有元素。
void replaceAll(UnaryOperator<E> operator)它用于将列表中所有元素替换为指定元素。
void retainAll(Collection<?> c)它用于保留列表中所有存在于指定集合中的元素。
E set(int index, E element)它用于替换列表中指定位置的指定元素。
void sort(Comparator<? super E> c)它用于根据指定的比较器对列表元素进行排序。
Spliterator<E> spliterator()它用于创建列表元素上的拆分器。
List<E> subList(int fromIndex, int toIndex)它用于获取给定范围内的所有元素。
int size()它用于返回列表中存在的元素数量。

如何创建 List?

ArrayList 和 LinkedList 类提供了 List 接口的实现。让我们看看创建 List 的示例

简而言之,我们可以创建任何类型的 List。ArrayList<T> 和 LinkedList<T> 类用于指定类型。这里,T 表示类型。

常见 List 操作

以下是可以在 Java List 上执行的一些基本操作。

1. 添加元素

2. 删除元素

3. 访问元素

4. 遍历 List

Java List 示例

让我们看一个简单的 List 示例,其中我们使用 ArrayList 类作为实现。

示例

编译并运行

输出

Mango
Apple
Banana
Grapes

如何将 Array 转换为 List

在 Java 中将数组转换为列表是一个常见的操作。我们可以通过遍历数组并使用 List.add() 方法逐个添加元素来将数组转换为列表。这是一种我们常用的方法。除此之外,还有一些其他方法可以使用,如下所示

方法 1: 使用 Arrays.asList()

方法 2: 使用 ArrayList 构造函数

示例

编译并运行

输出

Printing Array: [Java, Python, PHP, C++]
Printing List: [Java, Python, PHP, C++]

如何将 List 转换为 Array

我们可以通过调用 List.toArray() 方法将 List 转换为 Array。让我们看一个将列表元素转换为数组的简单示例。

示例

编译并运行

输出

Printing Array: [Mango, Banana, Apple, Strawberry]
Printing List: [Mango, Banana, Apple, Strawberry]

获取和设置 List 中的元素

get() 方法返回给定索引处的元素,而set() 方法更改或替换元素。

示例

编译并运行

输出

Returning element: Apple
Mango
Dates
Banana
Grapes

如何排序 List?

在 Java 中对列表进行排序可以使用 Collections.sort() 方法或使用 Java 8 中引入的 List.sort() 方法。以下是两种方法的示例

示例

编译并运行

输出

Apple
Banana
Grapes
Mango
Sorting numbers...
1
11
21
51

Java ListIterator 接口

ListIterator 接口用于向前和向后遍历元素。

ListIterator 接口声明

Java ListIterator 接口的方法

方法描述
void add(E e)该方法将指定元素插入到列表中。
boolean hasNext()该方法在向前遍历列表时,如果列表迭代器有更多元素,则返回 true。
E next()该方法返回列表中的下一个元素并向前移动光标位置。
int nextIndex()该方法返回后续调用 next() 将返回的元素的索引。
boolean hasPrevious()该方法在向后遍历列表时,如果此列表迭代器有更多元素,则返回 true。
E previous()该方法返回列表中的上一个元素并向后移动光标位置。
E previousIndex()该方法返回后续调用 previous() 将返回的元素的索引。
void remove()该方法从列表中删除由 next() 或 previous() 方法返回的最后一个元素
void set(E e)该方法用指定元素替换由 next() 或 previous() 方法返回的最后一个元素。

ListIterator 接口示例

示例

编译并运行

输出

Traversing elements in forward direction
index:0 value:Amit
index:1 value:Sachin
index:2 value:Vijay
index:3 value:Kumar
Traversing elements in backward direction
index:3 value:Kumar
index:2 value:Vijay
index:1 value:Sachin
index:0 value:Amit

List 示例:书籍

让我们看一个 List 的示例,其中我们正在添加书籍。

示例

编译并运行

输出

101 Let us C Yashwant Kanetkar BPB 8
102 Data Communications and Networking Forouzan Mc Graw Hill 4
103 Operating System Galvin Wiley 6

Java List 选择题

1. 以下关于 Java 中 ListIterator 接口的说法哪项是正确的?

  1. 它扩展了 List 接口。
  2. 它允许对列表中的元素进行双向遍历。
  3. 它只由 ArrayList 类实现。
  4. 它用于同步对列表的访问。
 

答案:b)

解释: ListIterator 接口提供了在向前和向后两个方向遍历列表的方法,允许对列表元素进行双向访问。


2. Java 中 ArrayList 和 LinkedList 之间有什么区别?

  1. ArrayList 是同步的,而 LinkedList 不是。
  2. ArrayList 将元素存储在连续的内存块中,而 LinkedList 使用双向链表。
  3. ArrayList 允许恒定时间的定位访问,而 LinkedList 不允许。
  4. ArrayList 是 List 接口的可变大小数组实现,而 LinkedList 是双向链表实现。
 

答案:d)

解释: ArrayList 内部使用动态数组来存储元素,而 LinkedList 使用双向链表。这种根本区别影响了它们的性能特性和对不同场景的适用性。


3. ArrayList 和 LinkedList 中 add(int index, E element) 操作的时间复杂度分别是多少?

  1. O(1) 和 O(n)
  2. O(n) 和 O(1)
  3. O(log n) 和 O(log n)
  4. O(n) 和 O(n)
 

答案:b)

解释: 在 ArrayList 中,在特定索引处插入元素需要移动后续元素,导致时间复杂度为 O(n)。在 LinkedList 中,通过调整指针可以在常数时间 (O(1)) 内在特定索引处插入元素,因为它涉及遍历到所需位置。


4. List 接口中 replaceAll(UnaryOperator <E> operator) 方法的目的是什么?

  1. 它替换列表中特定元素的所有出现。
  2. 它将列表中所有元素替换为新指定的元素。
  3. 它将指定的 unary 运算符应用于列表中的每个元素,用运算符的结果替换每个元素。
  4. 它从列表中删除特定元素的所有出现。
 

答案:c)

解释: List 接口中的 replaceAll() 方法将指定的 unary 运算符应用于列表中的每个元素,用运算符的结果替换每个元素。


5. 哪个方法用于获取列表中两个指定索引之间的部分?

  1. slice(int fromIndex, int toIndex)
  2. portion(int fromIndex, int toIndex)
  3. subList(int fromIndex, int toIndex)
  4. range(int fromIndex, int toIndex)
 

答案:c)

解释: List 接口中的 subList(int fromIndex, int toIndex) 方法用于获取列表中从指定的 fromIndex(包含)到 toIndex(不包含)之间的部分。


下一个主题Java HashSet 类