实用指南:java基础-LinkedList(链表)

news/2026/1/17 9:25:25/文章来源:https://www.cnblogs.com/yangykaifa/p/19495149

一、基本概念

LinkedList 是Java集合框架中实现List接口和Deque接口的双向链表。

// 类定义
public class LinkedListextends AbstractSequentialListimplements List, Deque, Cloneable, java.io.Serializable

二、核心特性

1. 双向链表结构

private static class Node {E item;          // 存储的数据Node next;    // 下一个节点Node prev;    // 上一个节点
}

2. 主要特点

  • 动态大小:无需指定初始容量

  • 非连续内存:通过指针连接

  • 插入/删除高效:O(1)时间复杂度(已知位置时)

  • 随机访问较慢:O(n)时间复杂度

  • 线程不安全:需要外部同步

三、常用操作

1. 创建LinkedList

// 创建空链表
LinkedList list1 = new LinkedList<>();
// 从其他集合创建
List numbers = Arrays.asList(1, 2, 3);
LinkedList list2 = new LinkedList<>(numbers);

2. 基本操作示例

import java.util.LinkedList;
public class LinkedListDemo {public static void main(String[] args) {LinkedList list = new LinkedList<>();// 添加元素list.add("Apple");list.add("Banana");list.addFirst("First");  // 添加到头部list.addLast("Last");    // 添加到尾部list.add(2, "Orange");   // 插入到指定位置System.out.println("初始列表: " + list);// 输出: [First, Apple, Orange, Banana, Last]// 访问元素System.out.println("第一个元素: " + list.getFirst());System.out.println("最后一个元素: " + list.getLast());System.out.println("索引2的元素: " + list.get(2));// 删除元素list.removeFirst();      // 删除头部list.removeLast();       // 删除尾部list.remove(1);          // 删除指定位置list.remove("Orange");   // 删除指定元素// 修改元素list.set(0, "Grape");// 大小和判断System.out.println("大小: " + list.size());System.out.println("是否包含Grape: " + list.contains("Grape"));System.out.println("是否为空: " + list.isEmpty());}
}

3. 作为队列使用(Queue)

LinkedList queue = new LinkedList<>();
// 入队
queue.offer("Task1");   // 尾部添加
queue.offer("Task2");
queue.offer("Task3");
// 查看队首
System.out.println("队首: " + queue.peek());  // Task1
// 出队
while (!queue.isEmpty()) {System.out.println("处理: " + queue.poll());  // 移除并返回队首
}

4. 作为双端队列使用(Deque)

LinkedList deque = new LinkedList<>();
// 从两端添加
deque.addFirst(1);      // 头部添加
deque.addLast(2);       // 尾部添加
deque.offerFirst(0);    // 头部添加
deque.offerLast(3);     // 尾部添加
// 从两端获取和移除
System.out.println("头部: " + deque.peekFirst());  // 查看头部
System.out.println("尾部: " + deque.peekLast());   // 查看尾部
System.out.println("移除头部: " + deque.pollFirst());  // 移除头部
System.out.println("移除尾部: " + deque.pollLast());   // 移除尾部

5. 作为栈使用(Stack)

LinkedList stack = new LinkedList<>();
// 压栈
stack.push("Data1");
stack.push("Data2");
stack.push("Data3");
// 弹栈
while (!stack.isEmpty()) {System.out.println("弹出: " + stack.pop());  // 后进先出
}

四、遍历方式

LinkedList list = new LinkedList<>();
list.add("A");
list.add("B");
list.add("C");
// 1. for循环(通过索引)
for (int i = 0; i < list.size(); i++) {System.out.println(list.get(i));  // 效率较低
}
// 2. 增强for循环
for (String item : list) {System.out.println(item);
}
// 3. 迭代器
Iterator iterator = list.iterator();
while (iterator.hasNext()) {System.out.println(iterator.next());
}
// 4. 双向迭代器
ListIterator listIterator = list.listIterator();
// 向前遍历
while (listIterator.hasNext()) {System.out.println(listIterator.next());
}
// 向后遍历
while (listIterator.hasPrevious()) {System.out.println(listIterator.previous());
}
// 5. forEach方法(Java 8+)
list.forEach(item -> System.out.println(item));
list.forEach(System.out::println);

五、性能对比

操作ArrayListLinkedList
随机访问O(1)O(n)
头部插入/删除O(n)O(1)
尾部插入/删除O(1)O(1)
中间插入/删除O(n)O(n)*
内存占用较低(连续)较高(节点开销)

注:LinkedList在中间插入也需要先找到位置,所以也是O(n)

六、使用场景建议

适合使用LinkedList的场景:

  1. 频繁的插入和删除(尤其是头部操作)

  2. 需要实现队列、双端队列或栈

  3. 内存充足,不频繁随机访问

适合使用ArrayList的场景:

  1. 频繁随机访问

  2. 内存较紧张

  3. 主要在尾部添加元素

七、线程安全版本

// 创建线程安全的LinkedList
List syncList = Collections.synchronizedList(new LinkedList<>());
// 或者在多线程环境下使用ConcurrentLinkedDeque
import java.util.concurrent.ConcurrentLinkedDeque;
ConcurrentLinkedDeque concurrentDeque = new ConcurrentLinkedDeque<>();

八、注意事项

  1. 非线程安全:多线程环境下需要外部同步

  2. 迭代器快速失败:迭代过程中修改会抛出ConcurrentModificationException

  3. 空元素:允许添加null元素

  4. 内存开销:每个元素都有额外的节点对象开销

九、示例:LRU缓存实现

class LRUCache {private final int capacity;private final LinkedList keys;private final Map cache;public LRUCache(int capacity) {this.capacity = capacity;this.keys = new LinkedList<>();this.cache = new HashMap<>();}public V get(K key) {if (cache.containsKey(key)) {keys.remove(key);          // 移除旧位置keys.addFirst(key);        // 放到头部(最近使用)return cache.get(key);}return null;}public void put(K key, V value) {if (cache.containsKey(key)) {keys.remove(key);} else if (keys.size() >= capacity) {K oldest = keys.removeLast();  // 移除最久未使用cache.remove(oldest);}keys.addFirst(key);cache.put(key, value);}
}

总结

LinkedList是Java中重要的数据结构,特别适合需要频繁插入删除的场景。它不仅是List,还可以作为Queue、Deque和Stack使用。选择LinkedList还是ArrayList取决于具体的应用场景和操作模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1172822.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计Django+Vue.js高考推荐系统 高考分数线预测 大数据毕设(源码+LW文档+PPT+讲解)

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

二分搜索树深度优先遍历

二分搜索树深度优先遍历 引言 二分搜索树&#xff08;Binary Search Tree&#xff0c;BST&#xff09;是一种特殊的树形数据结构&#xff0c;其特点是每个节点都有一个键值&#xff0c;左子节点的键值小于其父节点的键值&#xff0c;右子节点的键值大于其父节点的键值。深度优先…

互联网大厂Java小白求职面试全解析:从Spring到微服务与大数据

场景&#xff1a;求职者超好吃的面试 超好吃是一名刚毕业的Java程序员&#xff0c;今天他来到一家互联网大厂进行面试&#xff0c;面试官态度严肃&#xff0c;但也愿意指导初学者。以下是他们的对话内容&#xff1a;第一轮提问&#xff1a;Spring框架与基础Java 面试官&#xf…

RS485

#ifndef __RS485_H #define __RS485_H #include "sys.h"#include "stdio.h" #define SLAVE_ADDR 0x01 #define RX_BUF_SIZE 64 #define RS485_TX_EN() GPIO_SetBits(GPIOB, GPIO_Pin_7)…

Eclipse 重启选项详解

Eclipse 重启选项详解 引言 Eclipse,作为Java开发中广泛使用的集成开发环境(IDE),其稳定性和功能性一直备受开发者青睐。在Eclipse的使用过程中,重启选项是一个常见的操作,它可能涉及到工作空间的恢复、插件的重启等多种场景。本文将详细介绍Eclipse的重启选项及其相关…

基于VUE的高校发展学生党员管理系统[VUE]-计算机毕业设计源码+LW文档

摘要&#xff1a;随着高校学生党员数量的增加&#xff0c;传统的管理方式已难以满足发展学生党员工作的需求。本文旨在设计并实现一个基于VUE框架的高校发展学生党员管理系统&#xff0c;以提高管理效率和信息化水平。通过对系统进行详细的需求分析&#xff0c;明确了系统的功能…

2026年深圳热门的GEO全场景推广解决方案推荐,哪家公司靠谱? - 工业品牌热点

本榜单依托全维度市场调研与真实行业口碑,深度筛选出五家GEO推广领域标杆企业,为ToB企业选型提供客观依据,助力精准匹配适配的智能营销服务伙伴。 TOP1 推荐:南方网通 推荐指数:★★★★★ | 口碑评分:国内GEO全…

RDF 规则:构建语义网的基础

RDF 规则&#xff1a;构建语义网的基础 引言 资源描述框架&#xff08;Resource Description Framework&#xff0c;简称 RDF&#xff09;是一种用于描述网络资源的语义数据模型。它为数据提供了一个结构化的表示方法&#xff0c;使得数据可以更加灵活、方便地被交换和重用。RD…

Perl 数据库连接

Perl 数据库连接 引言 Perl是一种广泛使用的解释型、动态编程语言&#xff0c;因其强大的文本处理能力而备受喜爱。在处理大量数据时&#xff0c;数据库连接成为Perl程序中不可或缺的一部分。本文将详细介绍Perl数据库连接的方法、步骤以及注意事项。 Perl数据库连接概述 Perl数…

Markdown 列表

Markdown 列表 Markdown 是一种轻量级标记语言&#xff0c;它允许人们使用易读易写的纯文本格式编写文档&#xff0c;然后转换成结构化的HTML格式。在 Markdown 中&#xff0c;列表是非常常用的格式之一&#xff0c;它可以帮助我们清晰地组织信息。本文将详细介绍 Markdown 列表…

JavaScript 变量提升

JavaScript 变量提升 引言 在JavaScript编程语言中,变量提升是一种常见的现象,它对于理解JavaScript的工作原理至关重要。本文将深入探讨JavaScript变量提升的概念、原因、影响以及如何避免其带来的潜在问题。 什么是变量提升? 变量提升是JavaScript引擎在执行代码之前,…

HTML5 Web Workers

HTML5 Web Workers 概述 HTML5 Web Workers 是一种在浏览器中执行代码的技术,它允许开发者在后台线程中运行脚本,而不会影响页面的响应性能。这种技术主要被用于处理复杂或耗时的计算任务,从而不会阻塞主线程,提高用户体验。 什么是 Web Workers? Web Workers 是在浏览…

AngularJS 指令

AngularJS 指令 概述 AngularJS 是一个用于构建动态网页的框架,它通过指令(Directives)扩展了 HTML,使其具有更多的动态功能。本文将深入探讨 AngularJS 指令的概念、用法以及其在实际开发中的应用。 指令概述 指令是 AngularJS 中的一种特殊标记,它以 ng- 为前缀,用…

Python 环境搭建指南

Python 环境搭建指南 引言 Python 是一种广泛应用于数据分析、人工智能、网络开发等领域的编程语言。为了能够有效地使用 Python 进行开发,搭建一个合适的环境是至关重要的。本文将详细介绍如何搭建一个适合 Python 开发的环境,包括安装 Python、配置 IDE、以及一些常用库的…

智能垃圾桶、垃圾分类 App、环卫机器人、政策评估系统 YOLOV8模型如何训练生活垃圾分类检测数据集 建立基于深度学习框架YOLOV8垃圾检测系统

垃圾分类检测数据集 垃圾四类检测数据集 14964张 4类 YOLO格式【垃圾四类检测YOLO数据集】共【14964】张&#xff0c;按照8比2划分为训练集和验证集&#xff0c;其中训练集【11971】张&#xff0c;验证集【2993】张&#xff0c;模型分为【4】类&#xff0c;分类为&#xff1a;【…

QLC pSLC模式|超低功耗LDPC解码器

在NAND闪存向高密度、低成本演进的浪潮中,QLC凭借每单元4位的存储密度和亲民的价格,正快速挤占TLC的市场份额。但密度提升的背后,是QLC与生俱来的短板——更长的读写延迟、更低的PE(编程/擦除)循环寿命和更差的可靠性。 为了平衡性能与成本,伪SLC(Pseudo-SLC)模式成为行…

互联网核心系统架构白皮书:从 MySQL 到千万 QPS 的全链路工程体系

流量工程 缓存体系 写削峰 CQRS 异构存储 事件驱动 金融级稳定性设计 一、什么才是真正的“千万 QPS”? 先给出一个行业级结论: 千万 QPS 从来不是 MySQL 的能力,而是整个系统工程能力。 MySQL 在真正的千万 QPS 架构中,只承担 0.1%~1% 的请求量。 真实系统 QPS 分担…

动态NAND恢复技术打破QLC寿命天花板

在企业级存储领域,NAND闪存的“寿命焦虑”与“性能衰减”始终是两大核心痛点。随着数据量爆炸式增长,企业对存储设备的可靠性、生命周期和性能稳定性提出了近乎苛刻的要求——既要承受高P/E(编程/擦除)周期的高强度写入,又要保证从寿命初期(BOL)到寿命末期(EOL)的性能…

Kubernetes Pod 存储全景图:Volume、PVC、PV 到 CSI 的完整链路解析

适用场景:Kubernetes 存储设计 / 持久化数据 / 动态卷自动化 目录 Kubernetes Volume 概述 基础 Volume 类型 emptyDir、hostPath 网络存储 Volume NFS、云盘示例 PersistentVolume (PV) 与 PersistentVolumeClaim (PVC) 静态配置示例与访问模式 StorageClass 与动态卷配置(以…

为NAND续命:页隔离技术如何让“坏块“重获新生?

当年特斯拉因闪存故障召回15.8万辆Model S和Model X时,整个行业意识到一个被忽视的真相:即便在SSD普及的今天,我们依然深度依赖的NAND Flash闪存,正被耐久性和可靠性两大顽疾困扰。Program/Erase(P/E)循环导致的磨损老化、Cell间干扰引发的错误累积,让大量闪存块提前沦为…