Java LinkedList remove() 方法
remove()
方法是 Java LinkedList
类中的一个重要方法,用于从链表中移除元素。LinkedList 是 Java 集合框架的一部分,实现了 List 和 Deque 接口。
remove()
方法有几种不同的形式,每种形式都有特定的用途:
E remove() // 移除并返回列表的第一个元素
E remove(int index) // 移除指定位置的元素
boolean remove(Object o) // 移除第一次出现的指定元素
E remove(int index) // 移除指定位置的元素
boolean remove(Object o) // 移除第一次出现的指定元素
方法详解
remove() - 无参形式
实例
public E remove()
功能:移除并返回此列表的第一个元素。
参数:无
返回值:被移除的元素
异常:如果列表为空,抛出 NoSuchElementException
示例:
实例
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
String first = list.remove(); // 移除并返回 "Apple"
System.out.println("Removed: " + first); // 输出: Removed: Apple
System.out.println(list); // 输出: [Banana, Cherry]
list.add("Apple");
list.add("Banana");
list.add("Cherry");
String first = list.remove(); // 移除并返回 "Apple"
System.out.println("Removed: " + first); // 输出: Removed: Apple
System.out.println(list); // 输出: [Banana, Cherry]
remove(int index) - 带索引参数
实例
public E remove(int index)
功能:移除列表中指定位置的元素。
参数:
index
- 要移除的元素的索引
返回值:被移除的元素
异常:
IndexOutOfBoundsException
- 如果索引超出范围 (index < 0 || index >= size())
示例:
实例
LinkedList<Integer> numbers = new LinkedList<>();
numbers.add(10);
numbers.add(20);
numbers.add(30);
int removed = numbers.remove(1); // 移除索引为1的元素(20)
System.out.println("Removed: " + removed); // 输出: Removed: 20
System.out.println(numbers); // 输出: [10, 30]
numbers.add(10);
numbers.add(20);
numbers.add(30);
int removed = numbers.remove(1); // 移除索引为1的元素(20)
System.out.println("Removed: " + removed); // 输出: Removed: 20
System.out.println(numbers); // 输出: [10, 30]
remove(Object o) - 带对象参数
实例
public boolean remove(Object o)
功能:移除列表中第一次出现的指定元素(如果存在)。
参数:
o
- 要从列表中移除的元素(如果存在)
返回值:
true
- 如果列表包含指定元素false
- 如果列表不包含指定元素
示例:
实例
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Apple");
boolean result = fruits.remove("Apple"); // 移除第一个"Apple"
System.out.println("Removed? " + result); // 输出: Removed? true
System.out.println(fruits); // 输出: [Banana, Apple]
fruits.add("Apple");
fruits.add("Banana");
fruits.add("Apple");
boolean result = fruits.remove("Apple"); // 移除第一个"Apple"
System.out.println("Removed? " + result); // 输出: Removed? true
System.out.println(fruits); // 输出: [Banana, Apple]
方法比较
方法形式 | 参数类型 | 返回值 | 异常 | 用途 |
---|---|---|---|---|
remove() |
无 | E (元素类型) | NoSuchElementException | 移除并返回第一个元素 |
remove(int index) |
int | E (元素类型) | IndexOutOfBoundsException | 移除指定位置的元素 |
remove(Object o) |
Object | boolean | 无 | 移除第一次出现的指定元素 |
使用注意事项
性能考虑
LinkedList 的 remove()
方法在不同情况下的性能表现:
- 移除头部元素 (
remove()
或remove(0)
):O(1) 时间复杂度 - 移除尾部元素 (
remove(size()-1)
):O(1) 时间复杂度 - 移除中间元素:O(n) 时间复杂度,因为需要遍历到指定位置
并发修改
在使用迭代器遍历 LinkedList 时调用 remove()
方法可能会导致 ConcurrentModificationException
。正确的做法是使用迭代器自身的 remove()
方法。
错误示例:
实例
LinkedList<Integer> list = new LinkedList<>(Arrays.asList(1, 2, 3));
for (Integer num : list) {
if (num == 2) {
list.remove(num); // 可能抛出 ConcurrentModificationException
}
}
for (Integer num : list) {
if (num == 2) {
list.remove(num); // 可能抛出 ConcurrentModificationException
}
}
正确做法:
实例
Iterator<Integer> it = list.iterator();
while (it.hasNext()) {
Integer num = it.next();
if (num == 2) {
it.remove(); // 使用迭代器的 remove() 方法
}
}
while (it.hasNext()) {
Integer num = it.next();
if (num == 2) {
it.remove(); // 使用迭代器的 remove() 方法
}
}
null 值处理
LinkedList 允许存储 null 值,可以使用 remove(null)
来移除列表中的 null 元素。
实例
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.add(null);
list.add("B");
list.remove(null); // 移除 null 元素
System.out.println(list); // 输出: [A, B]
list.add("A");
list.add(null);
list.add("B");
list.remove(null); // 移除 null 元素
System.out.println(list); // 输出: [A, B]
实际应用示例
实现队列
LinkedList 的 remove()
方法可以用于实现队列的 FIFO(先进先出)特性:
实例
LinkedList<String> queue = new LinkedList<>();
queue.add("Task1");
queue.add("Task2");
queue.add("Task3");
while (!queue.isEmpty()) {
String task = queue.remove(); // 移除并返回第一个元素
System.out.println("Processing: " + task);
}
queue.add("Task1");
queue.add("Task2");
queue.add("Task3");
while (!queue.isEmpty()) {
String task = queue.remove(); // 移除并返回第一个元素
System.out.println("Processing: " + task);
}
删除特定条件的元素
实例
LinkedList<Integer> numbers = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5, 6));
// 移除所有偶数
numbers.removeIf(n -> n % 2 == 0);
System.out.println(numbers); // 输出: [1, 3, 5]
// 移除所有偶数
numbers.removeIf(n -> n % 2 == 0);
System.out.println(numbers); // 输出: [1, 3, 5]
与 ArrayList 的 remove() 比较
实例
// LinkedList 的 remove() 在中间位置性能较好
LinkedList<Integer> linkedList = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
linkedList.remove(2); // 相对高效
// ArrayList 的 remove() 在中间位置需要移动元素
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
arrayList.remove(2); // 需要移动后续元素
LinkedList<Integer> linkedList = new LinkedList<>(Arrays.asList(1, 2, 3, 4, 5));
linkedList.remove(2); // 相对高效
// ArrayList 的 remove() 在中间位置需要移动元素
ArrayList<Integer> arrayList = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
arrayList.remove(2); // 需要移动后续元素
总结
LinkedList 的 remove()
方法提供了多种形式来满足不同的移除需求:
remove()
- 快速移除头部元素,适合队列操作remove(int index)
- 精确控制要移除的元素位置remove(Object o)
- 基于元素值进行移除
在实际应用中,应根据具体需求选择合适的方法形式,并注意它们的性能特点和异常情况。理解这些方法的区别和适用场景,将帮助你更有效地使用 LinkedList 这一重要的集合类。
点我分享笔记