LinkedList源码解析与性能优化

LinkedList是Java集合框架中基于双向链表实现的列表,它提供了高效的插入和删除操作,但在随机访问方面性能较差。

1. LinkedList简介

LinkedList实现了List接口,基于双向链表实现。每个节点包含了元素本身、指向前一个节点的引用(前驱节点)以及指向后一个节点的引用(后继节点)。这种结构使得在链表中插入和删除元素的效率较高。

2. LinkedList类结构

2.1 类层次结构

java 复制代码
public class LinkedList<E>
        extends AbstractSequentialList<E>
        implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
    // ...
}
  • LinkedList继承自AbstractSequentialList,实现了List、Deque接口。
  • 实现了Cloneable接口,表示可以进行克隆。
  • 实现了Serializable接口,表示支持序列化。

2.2 内部节点类

java 复制代码
private static class Node<E> {
    E item;            // 元素值
    Node<E> next;      // 后继节点
    Node<E> prev;      // 前驱节点

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

3. LinkedList构造方法

3.1 无参构造方法

java 复制代码
// 无参构造方法,创建一个空的LinkedList
public LinkedList() {
}

3.2 拷贝构造方法

java 复制代码
// 拷贝构造方法,根据给定集合创建一个LinkedList
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}

4. LinkedList插入和删除操作

4.1 添加元素

java 复制代码
// 在链表末尾添加元素
public boolean add(E e) {
    linkLast(e);
    return true;
}

// 在指定位置插入元素
public void add(int index, E element) {
    checkPositionIndex(index);
    // 下标等于对应链表长度,在末尾添加元素
    if (index == size)
        linkLast(element);
    else
        // linkBefore 的逻辑
        // 1.先根据index找到要插入的位置。
        // 2.修改引用,完成插入操作。
        linkBefore(element, node(index));
}

4.2 删除元素

java 复制代码
// 移除指定位置的元素
public E remove(int index) {
    checkElementIndex(index);
    return unlink(node(index));
}

// 移除指定元素
public boolean remove(Object o) {
    if (o == null) {
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {
                unlink(x);
                return true;
            }
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}

5. LinkedList性能优化建议

5.1 使用Iterator遍历

在遍历LinkedList时,建议使用Iterator而不是通过索引访问元素。因为LinkedList上通过索引访问元素的方式性能较差,而使用Iterator则可以更高效地进行遍历。

java 复制代码
LinkedList<String> linkedList = new LinkedList<>();
// 不推荐
for (int i = 0; i < linkedList.size(); i++) {
    System.out.println(linkedList.get(i));
}
// 推荐
for (String s : linkedList) {
    System.out.println(s);
}

5.2 使用Iterator进行插入和删除

在LinkedList中,使用Iterator进行插入和删除操作是比较高效的。通过Iterator的add和remove方法,可以在遍历时进行元素的插入和删除。

java 复制代码
LinkedList<String> linkedList = new LinkedList<>();
ListIterator<String> iterator = linkedList.listIterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    // 在元素后插入新元素
    iterator.add("New Element");
    // 删除当前元素
    iterator.remove();
}

5.3 使用offer和poll方法

LinkedList实现了Deque接口,提供了offer和poll方法用于在两端进行插入和删除操作,这些方法效率较高。

java 复制代码
LinkedList<String> linkedList = new LinkedList<>();
// 在末尾添加元素
linkedList.offer("Last Element");
// 从头部移除元素
String firstElement = linkedList.poll();

6. 总结

LinkedList是基于双向链表实现的列表,具有高效的插入和删除操作。在实际使用中,建议使用Iterator进行遍历、插入和删除操作,以及利用Deque接口提供的offer和poll方法。通过这些优化策略,能够更好地发挥LinkedList的优势,提升程序性能。

相关推荐
布吉岛的石头5 分钟前
Java 程序员第 49 阶段11:Java 接 BERT:用 ONNX Runtime 做句向量推理
java·人工智能·python·深度学习·bert·transformer
niucloud-admin14 分钟前
JAVA V6 多商户商城 开发文档——JAVA服务端
java·开发语言
alexlifexyz28 分钟前
写了个 Claude Code 插件:AI 写的 Java 违反阿里规约,就写不进文件
java
威哥爱编程41 分钟前
【AI全栈12-01】Spring Boot 为何是 AI 全栈后端优选
java·spring boot·后端
威哥爱编程44 分钟前
【AI全栈12-03】Spring Boot 用多模型路由把智能客服成本降下来
java·spring boot·后端
威哥爱编程44 分钟前
【AI全栈12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·spring boot·后端
Wang's Blog1 小时前
Java 中间件之 RabbitMQ 快速入门: 异步通讯的优缺点
java·中间件·java-rabbitmq
用户094248568031 小时前
第31章:JVM字节码解释器与模板解释器源码路径
java·jvm
子非鱼a1 小时前
【WEB】EasySSTI
java·开发语言·前端
m0_587383001 小时前
深圳 24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·小程序·架构·需求分析