博客
关于我
LinkedList源码分析--jdk1.8
阅读量:800 次
发布时间:2023-01-31

本文共 2821 字,大约阅读时间需要 9 分钟。

JDK 8与LinkedList详细技术分析

JDK 8引入的LinkedList是一个基于内部类Node的双向链表,实现了List、Deque等接口。本文将从数据结构、源码分析、核心方法以及实际应用等方面探讨LinkedList的技术细节。

LinkedList的数据结构概述

LinkedList采用双向链表结构,每个节点包含以下成员:

  • element:存储实际数据
  • next:指向下一个节点
  • prev:指向前一个节点

双向链表具有如下特点:

  • 双向性:每个节点既有next指针(指向下一个节点),也有prev指针(指向上一个节点)
  • 无环且可逆:第一个节点的prev指向null,最后一个节点的next指向null
  • 插入删除高效:节省内存,直接修改邻接指针即可完成增删改查
  • LinkedList源码分析

    LinkedList类继承自AbstractSequentialList,实现了List、Deque等接口。其核心源码包括:

    public class LinkedList extends AbstractSequentialList
    implements List
    , Deque
    , Cloneable, Serializable { transient int size = 0; transient Node
    first; transient Node
    last; private static class Node
    { E item; Node
    prev; Node
    next; Node(Node
    prev, E element, Node
    next) { this.prev = prev; this.item = element; this.next = next; } } public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { Node
    l = last; Node
    newNode = new Node<>(l, e, null); last = newNode; if (l == null) { first = newNode; } else { l.next = newNode; } size++; modCount++; } public E remove() { return removeFirst(); } private E removeFirst() { Node
    f = first; unlinkFirst(f); return f.item; } private E unlinkFirst(Node
    f) { Node
    next = f.next; f.prev = null; if (f == last) { last = next; } if (next != null) { next.prev = null; } size--; modCount++; return f.item; } // 其他核心方法包括`remove(int index)`、`remove(Object o)`、`removeFirstOccurrence(Object o)`、`removeLastOccurrence(Object o)`、`linkBefore()`等}

    LinkedList的继承和实现

    LinkedList继承结构:

    LinkedList├── AbstractSequentialList│  └── AbstractList│     └── AbstractCollection└── Object

    实现的接口包括:

  • List
    :提供基本的集合操作方法
  • Deque
    :实现带有两端操作的队列接口
  • Cloneable:支持浅拷贝操作
  • Serializable:支持序列化操作
  • 核心方法分析

    LinkedList的增删方法采用了“快_delete”和“慢_delete”两种策略:

  • 快速删除:直接处理相邻节点进行调整
  • 慢删除:通过遍历找到目标节点后进行删除
  • 增加操作

    LinkedList提供6种重载的add方法:

  • add(E e):默认在尾部添加
  • add(int index, E e):在指定位置插入元素
  • addAll(Collection<E>)
  • addAll(int index, Collection<E>)
  • addFirst(E e)
  • addLast(E e)
  • 删除操作

    LinkedList提供7种重载的remove方法:

  • remove()
  • remove(int index)
  • remove(Object o)
  • removeFirst()
  • removeLast()
  • removeFirstOccurrence(Object o)
  • removeLastOccurrence(Object o)
  • 获取操作

    LinkedList提供的get方法包括:

  • get(int index)
  • getFirst()
  • getLast()
  • 查找操作

  • indexOf(Object o):从头到尾查找
  • lastIndexOf(Object o):从尾到头查找
  • 克隆操作

    LinkedList支持浅行拷贝:

    public Object clone() {    LinkedList
    clone = new LinkedList<>(); clone.first = null; clone.last = null; clone.size = 0; clone.modCount = 0; for (Node
    x = first; x != null; x = x.next) { clone.add(x.item); } return clone;}

    LinkedList的实际应用价值

  • 插入和删除效率高:仅需调整邻接指针,无需移动数据
  • 适用于需要频繁操作两端的场景:如双端队列 manipulation
  • 内存占用低:占用空间仅与元素数量成正比
  • 提供多种操作便利:支持集合、队列、序列化等多种功能
  • 总结

    LinkedList作为Java Collections家族的一员,凭借其双向链表架构,在数据存储与操作方面展现出独特优势。尽管其随机访问效率低于数组实现,但在灵活性和快速操作方面做到了极致。对于需要经常操作列表两端的应用场景, LinkedList 是一个理想的选择。

    转载地址:http://ykwfk.baihongyu.com/

    你可能感兴趣的文章
    MYSQL中频繁的乱码问题终极解决
    查看>>
    MySQL为Null会导致5个问题,个个致命!
    查看>>
    MySQL为什么不建议使用delete删除数据?
    查看>>
    MySQL主从、环境搭建、主从配制
    查看>>
    Mysql主从不同步
    查看>>
    mysql主从同步及清除信息
    查看>>
    MySQL主从同步相关-主从多久的延迟?
    查看>>
    mysql主从同步配置方法和原理
    查看>>
    mysql主从复制 master和slave配置的参数大全
    查看>>
    MySQL主从复制几个重要的启动选项
    查看>>
    MySQL主从复制及排错
    查看>>
    mysql主从复制及故障修复
    查看>>
    MySQL主从复制的原理和实践操作
    查看>>
    webpack loader配置全流程详解
    查看>>
    mysql主从复制,读写分离,半同步复制实现
    查看>>
    MySQL主从失败 错误Got fatal error 1236解决方法
    查看>>
    MySQL主从架构与读写分离实战
    查看>>
    MySQL主从篇:死磕主从复制中数据同步原理与优化
    查看>>
    mysql主从配置
    查看>>
    MySQL之2003-Can‘t connect to MySQL server on ‘localhost‘(10038)的解决办法
    查看>>