java学习--LinkedList

一、LinkedList 是什么?

LinkedList 是 Java 集合框架中 java.util 包下的一个实现类,它实现了 ListDeque 等接口,底层基于双向链表实现(JDK 1.6 及之前是循环链表,之后改为双向链表)。

简单来说:

  • 链表的每个元素(节点)包含「前驱节点引用」、「数据」、「后继节点引用」
  • 没有固定大小的数组结构,元素在内存中不是连续存储的
  • 支持快速的头尾节点操作,也支持按索引访问(但效率低)

二、核心特性

  1. 增删效率高 :在链表头部 / 尾部或指定节点附近增删元素时,只需修改节点引用,时间复杂度 O(1)(按索引增删需先遍历找节点,复杂度 O(n))。
  2. 查询效率低 :按索引访问元素时,需要从链表头 / 尾开始遍历,时间复杂度 O(n)(对比 ArrayList 的 O(1))。
  3. 非线程安全 :多线程环境下直接使用会有并发问题,需手动加锁或使用 Collections.synchronizedList(new LinkedList<>())
  4. 支持双端操作 :因为实现了 Deque 接口,可作为队列(Queue)、双端队列(Deque)、栈(Stack)使用。

三、常用操作示例

下面是 LinkedList 最常用的增删改查、队列 / 栈相关操作,代码可直接运行:

复制代码
import java.util.LinkedList;
import java.util.Queue;
import java.util.Deque;

public class LinkedListDemo {
    public static void main(String[] args) {
        // 1. 创建 LinkedList 对象
        LinkedList<String> list = new LinkedList<>();

        // 2. 新增元素
        list.add("Java");          // 尾部添加
        list.addFirst("Python");   // 头部添加
        list.addLast("C++");       // 尾部添加(等同于 add)
        list.add(2, "Go");         // 指定索引添加(索引从0开始)
        System.out.println("初始链表:" + list); // [Python, Java, Go, C++]

        // 3. 查询元素
        String first = list.getFirst(); // 获取头部元素:Python
        String last = list.getLast();   // 获取尾部元素:C++
        String index2 = list.get(2);    // 获取索引2的元素:Go
        System.out.println("索引2的元素:" + index2);

        // 4. 修改元素
        list.set(1, "JavaScript");     // 修改索引1的元素
        System.out.println("修改后链表:" + list); // [Python, JavaScript, Go, C++]

        // 5. 删除元素
        list.removeFirst();            // 删除头部元素
        list.removeLast();             // 删除尾部元素
        list.remove(0);                // 删除索引0的元素
        System.out.println("删除后链表:" + list); // []

        // 6. 作为队列(FIFO)使用
        Queue<String> queue = new LinkedList<>();
        queue.offer("A"); // 入队
        queue.offer("B");
        System.out.println("队列出队:" + queue.poll()); // A(出队并删除)
        System.out.println("队列首元素:" + queue.peek()); // B(仅查看)

        // 7. 作为栈(LIFO)使用(推荐用Deque而非Stack)
        Deque<String> stack = new LinkedList<>();
        stack.push("X"); // 入栈
        stack.push("Y");
        System.out.println("栈出栈:" + stack.pop()); // Y(出栈并删除)
        System.out.println("栈顶元素:" + stack.peek()); // X(仅查看)
    }
}

四、LinkedList vs ArrayList(核心区别)

特性 LinkedList ArrayList
底层结构 双向链表 动态数组
随机访问(get/set) 慢(O (n)) 快(O (1))
增删操作(非头尾) 慢(需遍历找节点,O (n)) 慢(需移动元素,O (n))
增删操作(头尾) 快(O (1)) 慢(可能扩容,O (n))
内存占用 高(每个节点存额外引用) 低(连续存储,仅预留空间)
适用场景 频繁增删头尾、队列 / 栈 频繁查询、少量增删

总结

  1. LinkedList 底层是双向链表 ,核心优势是头尾增删快 ,劣势是随机访问慢
  2. 它不仅是 List,还能作为 Queue/Deque 使用,适合实现队列、栈等结构。
  3. 选择 LinkedList 还是 ArrayList,核心看操作场景:频繁查用 ArrayList,频繁头尾增删用 LinkedList。
相关推荐
咩咩啃树皮7 小时前
第40篇:Vue3组件化开发精讲——组件拆分、复用、父子通信、工程化架构
java·前端·架构
灯澜忆梦7 小时前
GO_并发编程---定时器
开发语言·后端·golang
鱟鲥鳚7 小时前
Spring Boot 集成 LangChain4j:从模型调用到 Tool Calling(Demo版)
java·spring boot
-银雾鸢尾-7 小时前
C#中的StringBuilder相关方法
开发语言·c#
-银雾鸢尾-8 小时前
C#中结构体与类的区别;抽象类与接口的区别
开发语言·c#
世人万千丶8 小时前
参数管理_Flutter在鸿蒙平台路由参数最佳实践
学习·flutter·华为·harmonyos·鸿蒙
大模型码小白9 小时前
【Python零基础教程】继承、多态与魔法函数:面向对象编程三大核心特性详解
java·大数据·开发语言·人工智能·python·ai编程
腾渊信息科技公司9 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
爱笑的源码基地10 小时前
高并发 Redis 缓存门诊HIS系统源码,含财务统计药房进销存
java·程序·门诊系统·诊所系统·云诊所源码
wuqingshun31415910 小时前
TCP超时重传机制是为了解决什么问题?
java