【Java基础-44.2】Java中的LinkedList:特征与方法详解

在Java集合框架中,LinkedList是一个非常重要的数据结构,它实现了List和Deque接口,提供了双向链表的实现。与ArrayList不同,LinkedList在插入和删除操作上具有更高的效率,但在随机访问元素时性能较差。本文将深入探讨LinkedList的特征及其常用方法的应用。

1. LinkedList的特征

1.1 双向链表结构

LinkedList是基于双向链表实现的,每个节点(Node)都包含了对前一个节点和后一个节点的引用。这种结构使得LinkedList在插入和删除操作时非常高效,尤其是在列表的中间位置进行操作时。

1.2 动态大小

与数组不同,LinkedList的大小是动态的,可以根据需要自动扩展或缩小。这使得LinkedList在处理不确定数量的元素时非常灵活。

1.3 非同步

LinkedList不是线程安全的。如果多个线程同时访问一个LinkedList实例,并且至少有一个线程在结构上修改了列表,那么它必须在外部进行同步。

1.4 实现了Deque接口

LinkedList实现了Deque接口,因此它可以用作队列(FIFO)或双端队列(LIFO)。这使得LinkedList在需要实现栈或队列的场景中非常有用。

2. LinkedList的常用方法

2.1 添加元素

  • add(E e): 将元素添加到列表的末尾。
  • add(int index, E element): 在指定位置插入元素。
  • addFirst(E e): 将元素添加到列表的开头。
  • addLast(E e): 将元素添加到列表的末尾。
java 复制代码
LinkedList<String> list = new LinkedList<>();
list.add("A");
list.addFirst("B");
list.addLast("C");
list.add(1, "D");
System.out.println(list); // 输出: [B, D, A, C]

2.2 删除元素

  • remove(): 移除并返回列表的第一个元素。
  • remove(int index): 移除指定位置的元素。
  • removeFirst(): 移除并返回列表的第一个元素。
  • removeLast(): 移除并返回列表的最后一个元素。
java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("A", "B", "C", "D"));
list.remove(); // 移除A
list.removeFirst(); // 移除B
list.removeLast(); // 移除D
System.out.println(list); // 输出: [C]

2.3 获取元素

  • get(int index): 返回指定位置的元素。
  • getFirst(): 返回列表的第一个元素。
  • getLast(): 返回列表的最后一个元素。
java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("A", "B", "C"));
System.out.println(list.get(1)); // 输出: B
System.out.println(list.getFirst()); // 输出: A
System.out.println(list.getLast()); // 输出: C

2.4 遍历元素

  • 使用迭代器 : 可以使用Iterator或ListIterator遍历LinkedList。
  • 使用增强for循环: 也可以使用增强for循环遍历。
java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("A", "B", "C"));

// 使用迭代器
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

// 使用增强for循环
for (String element : list) {
    System.out.println(element);
}

2.5 其他常用方法

  • size(): 返回列表中的元素数量。
  • clear(): 移除列表中的所有元素。
  • contains(Object o): 判断列表是否包含指定元素。
  • indexOf(Object o): 返回指定元素首次出现的索引,如果列表不包含该元素,则返回-1。
java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("A", "B", "C"));
System.out.println(list.size()); // 输出: 3
System.out.println(list.contains("B")); // 输出: true
System.out.println(list.indexOf("C")); // 输出: 2
list.clear();
System.out.println(list); // 输出: []

3. LinkedList的应用场景

3.1 频繁插入和删除操作

由于LinkedList在插入和删除操作上具有较高的效率,因此在需要频繁进行这些操作的场景中,LinkedList是一个很好的选择。例如,实现一个任务队列或事件处理系统。

3.2 实现栈和队列

LinkedList实现了Deque接口,因此可以很方便地用作栈或队列。例如,可以使用addFirst和removeFirst方法实现栈,使用addLast和removeFirst方法实现队列。

java 复制代码
// 使用LinkedList实现栈
LinkedList<String> stack = new LinkedList<>();
stack.push("A");
stack.push("B");
System.out.println(stack.pop()); // 输出: B

// 使用LinkedList实现队列
LinkedList<String> queue = new LinkedList<>();
queue.offer("A");
queue.offer("B");
System.out.println(queue.poll()); // 输出: A

3.3 需要双向遍历的场景

由于LinkedList是双向链表,因此可以很方便地进行双向遍历。例如,可以使用ListIterator从后向前遍历列表。

java 复制代码
LinkedList<String> list = new LinkedList<>(Arrays.asList("A", "B", "C"));
ListIterator<String> iterator = list.listIterator(list.size());
while (iterator.hasPrevious()) {
    System.out.println(iterator.previous());
}

4. LinkedList与ArrayList的比较

特性 LinkedList ArrayList
数据结构 双向链表 动态数组
随机访问性能 较差 较好
插入和删除性能 较好(尤其在中间位置) 较差(尤其在中间位置)
内存占用 较高(每个节点需要额外的指针空间) 较低
适用场景 频繁插入和删除操作 频繁随机访问操作

5. 总结

LinkedList是Java集合框架中一个非常灵活的数据结构,特别适用于需要频繁插入和删除操作的场景。它提供了丰富的方法来操作列表,并且可以方便地用作栈或队列。然而,在需要频繁随机访问元素的场景中,ArrayList可能是更好的选择。

通过本文的介绍,相信你已经对LinkedList的特征及其常用方法有了更深入的了解。在实际开发中,根据具体需求选择合适的集合类,可以大大提高程序的效率和可维护性。

相关推荐
蛋蛋的就会顺顺的11 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要82612 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡12 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
死磕音视频13 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
伯恩bourne14 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_14 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
省钱兄--zs15 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲15 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog15 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
用户212968352616815 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm