博客
关于我
LinkedList源码分析--jdk1.8
阅读量:789 次
发布时间: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/

    你可能感兴趣的文章
    Laravel5.5开发规范 [ 个人总结 ]
    查看>>
    laravel5.5数据库迁移入门实践
    查看>>
    Laravel5.5添加新路由文件并制定规则
    查看>>
    laravel5.5组件之 Forms & HTML 组件 (laravelcollective/html)
    查看>>
    Laravel5.5集成七牛云上传、管理(删除、查询)
    查看>>
    Laravel5.5集成极光推送_解决推送失败重推问题
    查看>>
    laravel中composer镜像服务的方式
    查看>>
    Laravel前后台+API路由分离架构(完善)
    查看>>
    Laravel渴求式加载
    查看>>
    Laravel集合探学系列——添加扩展macro策略(一)
    查看>>
    Laravel项目宝塔部署全攻略:从0到1的实战指南
    查看>>
    laravl 文件存储云存储
    查看>>
    LARGE_INTEGER
    查看>>
    Lasso回归_ElasticNet回归_PolynomialFeatures算法介绍_01---人工智能工作笔记0032
    查看>>
    LaTeX 在线编辑器(LaTeX online editors)
    查看>>
    latex不能识别eps图片
    查看>>
    LaTeX介绍-ChatGPT4o作答
    查看>>
    LaTeX伪代码编辑
    查看>>
    Latex相关文章
    查看>>
    Laurent级数与奇点分析
    查看>>