博客
关于我
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/

    你可能感兴趣的文章
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    netmiko 自动判断设备类型python_Python netmiko模块的使用
    查看>>
    NetMizer-日志管理系统 dologin.php SQL注入漏洞复现(XVE-2024-37672)
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    netstat命令用法详解
    查看>>
    Netstat端口占用情况
    查看>>
    Netty 4的内存管理:sun.misc.Unsafe
    查看>>
    Netty channelRegistered\ChannelActive---源码分析
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中实现多客户端连接与通信-以实现聊天室群聊功能为例(附代码下载)
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    netty之 定长数据流处理数据粘包问题
    查看>>
    Netty事件注册机制深入解析
    查看>>
    Netty入门使用
    查看>>