博客
关于我
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学习总结(33)——阿里云centos配置MySQL主从复制
    查看>>
    Mysql学习总结(35)——Mysql两千万数据优化及迁移
    查看>>
    Mysql学习总结(36)——Mysql查询优化
    查看>>
    Mysql学习总结(37)——Mysql Limit 分页查询优化
    查看>>
    Mysql学习总结(38)——21条MySql性能优化经验
    查看>>
    Mysql学习总结(39)——49条MySql语句优化技巧
    查看>>
    Mysql学习总结(3)——MySql语句大全:创建、授权、查询、修改等
    查看>>
    Mysql学习总结(40)——MySql之Select用法汇总
    查看>>
    Mysql学习总结(41)——MySql数据库基本语句再体会
    查看>>
    Mysql学习总结(42)——MySql常用脚本大全
    查看>>
    Mysql学习总结(43)——MySQL主从复制详细配置
    查看>>
    Mysql学习总结(44)——Linux下如何实现mysql数据库每天自动备份定时备份
    查看>>
    Mysql学习总结(45)——Mysql视图和事务
    查看>>
    Mysql学习总结(46)——8种常被忽视的SQL错误用法
    查看>>
    Mysql学习总结(48)——MySql的日志与备份还原
    查看>>
    Mysql学习总结(49)——从开发规范、选型、拆分到减压
    查看>>
    Mysql学习总结(4)——MySql基础知识、存储引擎与常用数据类型
    查看>>
    Mysql学习总结(50)——Oracle,mysql和SQL Server的区别
    查看>>
    Mysql学习总结(51)——Linux主机Mysql数据库自动备份
    查看>>
    Mysql学习总结(52)——最全面的MySQL 索引详解
    查看>>