jdk源码剖析之LinkedList

【1.JDK底层源码剖析】1.4 LinkedList 底层数据结构剖析 LinkedList底层采用双向链表结构,每个节点包含数据项和前驱/后继指针。核心特性包括:O(1)时间复杂度的头尾增删操作、通过指针修改实现O(1)中间插入(但定位需O(n))、O(n)随机访问性能。与ArrayList对比,更适合频繁增删场景,但内存占用更高且访问效率低。关键注意事项:避免索引遍历(应用迭代器)、非线程安全、内存局部性差。实际应用中应根据操作类型(增删为主选LinkedList,随机访问为主选ArrayList)选择合适实现。 阅读详情

LinkedList的实现原理

    LinkedList底层是通过双向链表实现的,在LinkedList中定义了一个Node内部类,其内部结构如下:

    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;
        }
    }

    其包含一个prev和一个next分别指向上一个节点和下一个节点。在LinkedList定义如下:

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

    /**
     * Pointer to first node.
     * Invariant: (first == null && last == null) ||
     *            (first.prev == null && first.item != null)
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     * Invariant: (first == null && last == null) ||
     *            (last.next == null && last.item != null)
     */
    transient Node<E> last;

    /**
     * The number of times this list has been <i>structurally modified</i>.
     * Structural modifications are those that change the size of the
     * list, or otherwise perturb it in such a fashion that iterations in
     * progress may yield incorrect results.
     *
     * <p>This field is used by the iterator and list iterator implementation
     * returned by the {@code iterator} and {@code listIterator} methods.
     * If the value of this field changes unexpectedly, the iterator (or list
     * iterator) will throw a {@code ConcurrentModificationException} in
     * response to the {@code next}, {@code remove}, {@code previous},
     * {@code set} or {@code add} operations.  This provides
     * <i>fail-fast</i> behavior, rather than non-deterministic behavior in
     * the face of concurrent modification during iteration.
     *
     * <p><b>Use of this field by subclasses is optional.</b> If a subclass
     * wishes to provide fail-fast iterators (and list iterators), then it
     * merely has to increment this field in its {@code add(int, E)} and
     * {@code remove(int)} methods (and any other methods that it overrides
     * that result in structural modifications to the list).  A single call to
     * {@code add(int, E)} or {@code remove(int)} must add no more than
     * one to this field, or the iterators (and list iterators) will throw
     * bogus {@code ConcurrentModificationExceptions}.  If an implementation
     * does not wish to provide fail-fast iterators, this field may be
     * ignored.
     */
    protected transient int modCount = 0;
}
    包含first、last、size和modCount。其中的核心方法包括:

linkFirst:

1.创建新的节点指向原first

2.并置当前节点为first

    /**
     * Links e as first element.
     */
    private void linkFirst(E e) {
        final Node<E> f = first;
        final Node<E> newNode = new Node<>(null, e, f);
        first = newNode;
        if (f == null)
            last = newNode;
        else
            f.prev = newNode;
        size++;
        modCount++;
    }

linkLast:

1.原last节点的next节点指向我们的newNode

2.置newNode为新的last节点

    /**
     * Links e as last element.
     */
    void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

unlinkFirst:

1.当前first节点置为null,方便gc时回收。

2.修改first节点next节点的prev为null。

3.当前first节点修改为first的next节点。

    /**
     * Unlinks non-null first node f.
     */
    private E unlinkFirst(Node<E> f) {
        // assert f == first && f != null;
        final E element = f.item;
        final Node<E> next = f.next;
        f.item = null;
        f.next = null; // help GC
        first = next;
        if (next == null)
            last = null;
        else
            next.prev = null;
        size--;
        modCount++;
        return element;
    }

unlinkLast:

1.当前last节点置为null,方便gc回收。

2.当前last节点的prev节点的next置为null。

3.当前last修改为原last节点的prev节点。

    /**
     * Unlinks non-null last node l.
     */
    private E unlinkLast(Node<E> l) {
        // assert l == last && l != null;
        final E element = l.item;
        final Node<E> prev = l.prev;
        l.item = null;
        l.prev = null; // help GC
        last = prev;
        if (prev == null)
            first = null;
        else
            prev.next = null;
        size--;
        modCount++;
        return element;
    }

unlink:


    /**
     * Unlinks non-null node x.
     */
    E unlink(Node<E> x) {
        // assert x != null;
        final E element = x.item;
        final Node<E> next = x.next;
        final Node<E> prev = x.prev;

        if (prev == null) {
            first = next;
        } else {
            prev.next = next;
            x.prev = null;
        }

        if (next == null) {
            last = prev;
        } else {
            next.prev = prev;
            x.next = null;
        }

        x.item = null;
        size--;
        modCount++;
        return element;
    }






Ubuntu 20.04 环境下Autoware.universe 与 Carla 0.9.13 联合仿真 安装内容: ROS Galactic Autoware.universe based on ROS Galactic Carla 0.9.13 UnrealEngine 4.26 Openplanner (additional files: op-bridge/op-agent/scenariorunner/map data) 阅读详情

相关推荐

usb gadget uvc driver的code分析

uvc的linux driver分为host侧和gadget侧两个driver。host侧的driver在v4l2框架下,而设备侧的driver在usb/gadget文件夹下。gadget侧的uvc driver,利用v4l2框架去注册video_device,向应用层提供调用接口。同时,它完成v4l2 video buffer拷贝到usb request下的buffer下,然后利用uvc实现的协

lintwins的专栏 1万+

LinkedList源码解析

LinkedList是一个双端有序列表,它支持在任何位置进行高效的插入和删除操作,在JAVA集合概览这篇文章,我们说的它实现了Deque接口,在这篇文章中主要谈谈对LinkedList源码的解读。 为什么LinkedList支持高效的插入和删除操作? 因为LinkedList中的元素,除了保存了值以外还保存了上一个元素以及下一个元素的引用,这样在添加或者删除的时候,只要...

吃时间的虫子 755

Claude Code vs Codex

Claude Code 提供了一个生产就绪(production-ready)的实现,包含良好的错误处理、优雅的关闭逻辑、详细注释和文档,以及内置测试。Claude Code 输出了一个可运行的 Next.js + TypeScript 前端,但错过了一些设计里的黄色主题元素;Codex 则生成自己的版本,没有导出设计中的图片,也没严格遵照设计主题。Codex 完成同样功能,但更简洁直接,文档和注释少一些但功能达标。任务都用同样的提示,使用 TypeScript 实现,并在一天内完成。

weixin_49869937的博客 2387

集合系列LinkedList

LinkedList实现原理

t314267105的博客 297

python怎样按某一列值拆分Excel表格

pd.ExcelWriter@python #用python按某一列拆分Excel工作表,将内容写入一个工作簿 本次以“按照表中的某一列,将一张表格拆分为多张表”的需求为例,简单介绍这个过程中用到的pd.ExcelWriter,及每一句的作用。 如上表《学生.xlsx》,假设有14万行28列,请按照学校名,拆分表格(不想用复制粘贴)。 ##代码及解释如下 import pandas as pd from time import time#用来计算时间,展示进度,减少焦虑 in_ws='学生.xlsx'#

learn_get的博客 6785

【开源教程25】疯壳·开源编队无人机-定高、定点、悬停

【开源教程25】疯壳·开源编队无人机-定高、定点、悬停

efans_Mike的博客 1651

Java Review - LinkedList源码解读

文章目录Pre概述 Pre Java Review - ArrayList 源码解读 概述 从上图可知: LinkedList同时实现了List接口和Deque接口,既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(Stack) 。 当需要使用栈或者队列时,可以考虑使用LinkedList,一方面是因为Java官方已经声明不建议使用Stack类,更遗憾的是,Java里根本没有一个叫做Queue的类(它是个接口名字)。 关于栈或队列,现在的首选是ArrayDeque

小工匠 2万+

[系统安全] 十七.Windows PE病毒概念、分类及感染方式详解

作者前文介绍了PE文件格式,熟悉各种PE编辑查看工具,针对目标EXE程序新增对话框等;这篇文章将介绍Windows PE病毒, 包括PE病毒原理、分类及感染方式详解,并通过案例进行介绍。这些基础性知识不仅和系统安全相关,同样与我们身边的APP、常用软件及操作系统紧密联系,希望这些知识对您有所帮助,更希望大家提高安全意识,安全保障任重道远。本文参考了《软件安全》视频、安全网站和参考文献中的文章,并结合自己的经验和实践进行撰写,也推荐大家阅读参考文献。

杨秀璋的专栏 1万+

Java基础知识总结 ——LinkedList源码

一、整体架构及属性 LinkedList底层数据结构是一个双向链表,如图: 链表中的元素时Node,结构如下: private static class Node<E> { E item;// 节点值 Node<E> next; // 指向的下一个节点 Node<E> prev; // 指向的前一个节点 // 初始化参数顺序分...

Xiaowei's Blog 620

PCL点云处理之计算点到空间直线距离的四种方法(二十三)

PCL点云处理之计算点到空间直线距离的四种方法

weixin_44329757的博客 3022

RK3588 buildroot 制作的系统增加 docker 支持

RK3588 使用buildroot制作的系统添加 docker 和 docker-compose 的功能

荻夜的博客 1567

【小笨鸟看JDK1.7集合源码之三】LinkedList源码剖析

LinkedList简介 (1)基于双向循环链表的结构,实现了Deque接口,可以用作堆栈、队列或双端队列使用; (2)实现为非同步的,即在多线程下是不安全的,单线程安全; (3)实现了Cloneable、Serializable,可以克隆与被序列化; JDK1.7-LinkedList源码详细分析 1 package java.util; 2 /** 3 * JDK1....

weixin_30652271的博客 192

使用Simulink进行四足机器人的非线性动力学建模与仿真

四足机器人的运动包含多个自由度(DOF),包括腿部的摆动和支撑阶段的动力学特性。由于存在接触力、摩擦以及不同地形的影响,四足机器人的动力学行为呈现出高度的非线性特征。因此,构建准确的非线性动力学模型对于研究机器人的运动学和动力学特性至关重要。定义代表机器人状态的变量,如位置、速度、角度和角速度。matlab深色版本通过本指南,我们介绍了如何基于Simulink搭建一个四足机器人的非线性动力学模型,并进行了详细分析。

xiaoheshang_123的博客 311

Java集合源码剖析——基于JDK1.8中LinkedList的实现原理

Java集合源码剖析——基于JDK1.8中LinkedList的实现原理

贝尔摩德苦艾酒 8203

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LinkedList源码剖析(JDK6)

LinkedList简介 LinkedList是基于双向循环链表(从源码中可以很容易看出)实现的,除了可以当做链表来操作外,它还可以当做栈、队列和双端队列来使用。 LinkedList同样是非线程安全的,只在单线程下适合使用。 LinkedList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了Cloneable接口,能被克隆...

weixin_34185560的博客 148

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Java】 —— 数据结构与集合源码:Vector、LinkedList在JDK8中的源码剖析

查找和添加(尾部添加)操作效率高,时间复杂度为O(n)(有可能添加操作是O(1))链表底层的物理结构是链表,因此根据索引访问的效率不高,即查找元素慢。删除和插入操作效率低,时间复杂度 为O(n)。如果开发中,大体确认数组的长度,则推荐使用ArrayList(int capacity)这个构造器,避免底层的扩容、复制数组的操作。2、ArrayList底层使用数组结构:查找和添加(尾部添加)操作效率高,时间复杂度为O(1)。LinkedList底层使用双向链表结构:删除和插入操作效率高,时间复杂度为O(1)。

weixin_63106307的博客 824

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

数据结构-链表(Java语言实现)、JDK中LinkedList源码剖析

我们刚接触数据结构最基础的数据结构那就是数组,但是数组在创建时大小就要被固定,数组的存储地址要是连续的等等不好的地方,当然数组也有他的好处,查询速度快等等我们这篇博客以数组和链表的不同开始讲解链表,最后再来剖析一下JDK中实现的链表LinkedList的源码,通过学习源码进一步提升。 有兴趣朋友可以看看我的数组的博客。 文章目录数组和链表链表的实现单链表单向循环链表双向链表逆置链表判断链表是否有环LinkedList源码剖析 数组和链表 数组有‘1好2不好’ 好是,数组的内存是绝对连续的,因此数组的随

qq_42411214的博客 509

Java集合类详解(2) -- 从JDK1.8源码看LinkedList

上一篇文章我们分析了ArrayList,今天我们来讲讲LinkedList,与ArrayList的底层实现为动态数组不同,LinkedList的底层实现为双向链表,下面我们一起进入LinkedList的学习吧! 我们今天走走高速,直接先上定义 public class LinkedList<E> extends AbstractSequentialList<E> ...

Geffin的博客 292

jdk1.8 java.util.LinkedList源码分析

jdk1.8 java.util.LinkedList源码分析: public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable{ transient int size = 0; //底层维护...

淋雨西河的博客 177

LinkedList 源码深度分析(基于 JDK 8)

本文深入分析了JDK8中LinkedList的源码实现。LinkedList基于双向链表结构,同时实现了List和Deque接口,兼具列表和双端队列特性。文章详细剖析了其核心设计:1)类结构与Node内部类实现;2)构造方法与元素增删改查的核心操作;3)Deque接口实现的双端队列特性;4)支持双向迭代的ListIterator实现;5)克隆与序列化机制。重点阐述了链表节点操作的高效实现,包括link/unlink系列方法,以及通过二分查找优化节点定位的node方法。最后对比了LinkedList与Arra

qq_29515513的博客 1966

基于jdk1.8的LinkedList的源码分析

基于jdk1.8的LinkedList的源码分析 前言:上篇文章我们已经分析了ArrayList的源码,了解到ArrayList的底层其实是数组结构,但是今天分析LinkedList的底层结构不太一样,它的底层是基于链表来实现的。本文我们还是会从构造方法、增加元素、删除元素、修改元素、查找元素以及它的遍历来进行解析。 一:基本的链表 在开始分析LinkedList的源码之前,我们先了解一下基本的链...

成长的脚印 239

【Java从头开始到光头结束】No5.JDK1.8 LinkedList源码学习

JAVA 之 LinkedList 书中自有黄金屋,书中自有颜如玉 ———————————————————————————————————— 本文在《码出高效:Java开发手册》书本讲解内容的基础上,将和大家一起对JDK1.8版本中的LinkedList源代码进行分析学习,同时和ArrayList的实现代码进行对比说明,争取做到知其然,也知其所以然。 好的,我们正式开始,先看图 继承实现关系如下 LinkedList 的本质是双向链表。与 ArrayList 相比 LinkedList 的插入和删除

菲林都已拆走 450

Vector,ArrayList,Linkedlist源码分析

list接口和set集合

Cocobuhui的博客 973

JDK源码阅读-----集合框架篇

文章目录JDK源码阅读指导:ArrayList源码构造方法add方法分析(扩容机制)get方法分析其它Vector源码(过时?虽然安全但效率太低了)Vector和ArrayList比较Stack(过时)源码LinkedList源码属性罗列其它HashSet源码TreeSet源码HashMap源码类结构图:JDK1.8源码:TreeMap源码Iterable和Iterator区别 JDK源码阅读指导...

qq_37805900的博客 515

JUC并发—Java集合包底层源码剖析

如果不会频繁插入元素,导致频繁的移动元素位置、List扩容,而主要用于遍历集合或通过索引随机读取元素,那么可以用ArrayList。如果会频繁插入元素到List中,那么尽量还是不要用ArrayList,因为很可能会造成大量的元素移动 + 数组扩容 + 元素拷贝。一.remove()和add(index, element)都会导致数组的拷贝(System.arraycopy()),因此性能都不是太高。所以基于ArrayList来进行随机位置的插入和删除,性能不会太高。

kfashfasf的博客 636

ArrayList、LinkedList、HashMap、HashTable集合源码分析

ArrayList、LinkedList、HashMap、HashTable集合源码分析 JDK1.8和JDK1.7及以下 两个版本中集合类区别还是很大的,所以就按这两个版本来说 一、ArrayList 1.JDK1.8和JDK1.7及以下版本中,ArrayList集合底层都是由数组实现,不同的是默认长度 2.JDK1.8中,在不指定集合长度时,默认长度为0,只有在添加第一个元素的时候,集合长度才会变为10 private static final Object[] DEFAULTCAPACITY_EMPT

qq_36816062的博客 251
上一篇: jdk源码剖析之EnumMap
下一篇: interceptor的应用与源码分析
morning_judger
博客等级 码龄16年 403粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

morning_judger

您的鼓励是我创作最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值