Java集合源码分析—LinkedList

嵌入式Linux开发必备:设备树插件动态加载实战指南(RK356x平台为例) 本文以RK356x平台为例,详细介绍了嵌入式Linux开发中设备树插件的动态加载实战。通过configfs接口,开发者可以在系统运行时动态修改硬件配置,实现外设的即插即用与调试,无需重启设备,极大提升了开发与调试效率。 阅读详情

LinkedList源码分析

LinkedList结构

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList继承自AbstractSequentialList<E>,实现了List、Deque、Cloneable、Serializable接口。

LinkedList内部是一个双向链表结构。

源码分析

属性

// 元素个数
transient int size = 0;

// 指向第一个节点
transient Node<E> first;

// 指向最后一个节点
transient Node<E> last;

// 内部类,用于实现链表
private static class Node<E> {
    E item; // 存储的元素
    Node<E> next; // 下一个节点 尾元素的next指向null
    Node<E> prev; // 上一个节点 头元素的prev指向null

    Node(Node<E> prev, E element, Node<E> next) {
        this.item = element;
        this.next = next;
        this.prev = prev;
    }
}

构造

// 默认构造方法,size为0,first和last为空
public LinkedList() {
}
public LinkedList(Collection<? extends E> c) {
    this();
    addAll(c);
}
public boolean addAll(Collection<? extends E> c) {
    return addAll(size, c);
}
public boolean addAll(int index, Collection<? extends E> c) {
    checkPositionIndex(index);

    // 将集合转化为数组
    Object[] a = c.toArray();
    int numNew = a.length;
    // 数组长度为0,直接返回false
    if (numNew == 0)
        return false;
	// pred表示前驱节点,succ是当前要插入的位置
    Node<E> pred, succ;
    if (index == size) {
        // 添加到list的末尾
        succ = null;
        pred = last;
    } else {
        // 添加到指定位置,即index前
        succ = node(index);
        pred = succ.prev;
    }

    // 遍历数组,将其连成链表
    for (Object o : a) {
        @SuppressWarnings("unchecked") E e = (E) o;
        Node<E> newNode = new Node<>(pred, e, null);
        if (pred == null)
            // 如果list表为空,新节点为首节点
            first = newNode;
        else
            // 如果存在前节点,前节点会向后指向新加的节点
            pred.next = newNode;
        //新加的节点成为前一个节点
        pred = newNode;
    }
	//添加集合中的元素完成后,将指定位置后面的元素连到链表后方
    if (succ == null) {
        last = pred;
    } else {
        pred.next = succ;
        succ.prev = pred;
    }

    size += numNew;
    modCount++;
    return true;
}

方法

add(E e)
// 将元素插入链表末尾
public boolean add(E e) {
    linkLast(e);
    return true;
}
void linkLast(E e) {
    final Node<E> l = last;
    final Node<E> newNode = new Node<>(l, e, null);
    // 更新last节点为新节点
    last = newNode;
    if (l == null)
        // 如果last节点为null,将新节点设为first
        first = newNode;
    else
        // 否则,将last节点的next指向新节点
        l.next = newNode;
    size++;
    modCount++;
}
add(int index,E element)
public void add(int index, E element) {
    checkPositionIndex(index);

    if (index == size)
        linkLast(element);
    else
        linkBefore(element, node(index));
}
Node<E> node(int index) {
    
    if (index < (size >> 1)) {
        Node<E> x = first;
        for (int i = 0; i < index; i++)
            x = x.next;
        return x;
    } else {
        Node<E> x = last;
        for (int i = size - 1; i > index; i--)
            x = x.prev;
        return x;
    }
}
// 在指定节点前插入节点,节点succ不能为空
void linkBefore(E e, Node<E> succ) {
    //取出指定节点的前驱节点
    final Node<E> pred = succ.prev;
    final Node<E> newNode = new Node<>(pred, e, succ);
    //修改指定节点的前驱为新节点
    succ.prev = newNode;
    if (pred == null)
        first = newNode;
    else
        pred.next = newNode;
    size++;
    modCount++;
}
remove()
public E remove() {
    return removeFirst();
}
public E removeFirst() {
    final Node<E> f = first;
    if (f == null)
        throw new NoSuchElementException();
    return unlinkFirst(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;// 将节点后继置空,帮助回收
    first = next;// 首节点的下一个节点成为新的首节点
    if (next == null)
        last = null;
    else
        next.prev = null;
    size--;
    modCount++;
    return element;
}
remove(Object o)
public boolean remove(Object o) {
    if (o == null) {
        for (Node<E> x = first; x != null; x = x.next) {
            if (x.item == null) {
                unlink(x);
                return true;
            }
        }
    } else {
        for (Node<E> x = first; x != null; x = x.next) {
            if (o.equals(x.item)) {
                unlink(x);
                return true;
            }
        }
    }
    return false;
}
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;
}
remove(int index)
public E remove(int index) {
    checkElementIndex(index);
    return unlink(node(index));
}
使用verilog实现基于FPGA的TDC设计 verilog实现TDC 高精度时间数字转换器概述(TDC) 简介: TDC被用于测量时间间隔,应用在物理研究、飞行时间测量领域等。 本设计使用verilog实现并在xilinx和altera的FPGA上均可实现! 设计中使用到下述几个模块,包括FIFO,COUNT等,在xilinx下也使用到了一些原语等。下面有实现的代码和仿真截图等。 顶层模块设计如下: module top( input wire start, input wire stop, input wire clk, output wire T 阅读详情

相关推荐

为什么你的XGBoost多分类效果不如预期?可能是这5个参数没调对

本文深度剖析了XGBoost模型在处理多分类问题时效果不佳的五大关键参数陷阱。针对多分类问题的独特性,文章提供了max_depth、learning_rate、采样参数及正则化参数等核心参数的量化调整策略与诊断方法,帮助开发者精准调优,有效提升模型在各类别上的均衡性能与泛化能力。

weixin_29182481的博客 296

一文读懂,java list集合详解及arraylist,linkedlist集合底层源码分析

Collection集合概述是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素JDK 不提供此接口的任何直接实现.它提供更具体的子接口(如Set和List)实现创建Collection集合的对象多态的方式具体的实现类ArrayListCollection集合常用方法方法名说明添加元素从集合中移除指定的元素根据条件进行移除清空集合中的元素判断集合中是否存在指定的元素判断集合是否为空集合的长度,也就是集合中元素的个数List集合的概述。

m0_58975186的博客 1004

BLE天线设计避坑:NRF52832官方50欧姆阻抗匹配的3个常见误区

本文深入解析NRF52832蓝牙SoC天线设计中的常见误区,重点探讨50欧姆阻抗匹配的3个关键问题:PCB板材介电常数差异、匹配元件寄生参数及VSWR测试。通过实测数据和优化方案,帮助工程师规避设计陷阱,提升BLE通信性能。

beer8的博客 216

Java集合:ArrayList的使用及源码分析、Vector和LinkedList的使用

ArrayList的使用及源码分析

qq_59212867的博客 304

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4945

龙芯3A5000开发板PMON升级UEFI固件实战指南

固件是计算机硬件与操作系统之间的关键桥梁,负责初始化硬件并引导系统启动。其工作原理是在上电后执行自检、加载引导程序,最终将控制权移交操作系统。在国产化平台中,采用标准化的UEFI固件具有重要技术价值,它能提供图形化配置界面、统一硬件驱动模型,并支持安全启动等现代特性,从而显著提升硬件兼容性与系统管理效率。这一技术广泛应用于PC、服务器及嵌入式设备,尤其在需要运行银河麒麟等主流操作系统的龙芯开发板场景中,将传统PMON固件升级至UEFI,能实现更流畅的系统安装与更稳定的运行体验。本文基于固件升级与UEFI引导

weixin_42664597的博客 564

java集合-ArrayList/Vector/ LinkedList源码分析

以上策略不适用,编者重写了else语句,会直接选择在DEFAUIT_CAPCITY和minCapacity中最大的那个(因为需要满足存储的需求),可以看到这里的DEFAUIT_CAPCITY被初始化为一个长度为 10 的数组。用crtl+b步入add函数,if语句用来判断位置是否已满,若相等则说明已满,需要用grow()扩展,接着就是赋值和将size++,若长度足够,则不需要调用grow()没有被显式设置,扩容时的增长量将与当前容量相同,会使用推荐的增长策略(通常是。引用,指向新的数组,完成扩容操作。

2301_81088399的博客 894

用迅为RK3588开发板DIY无人机飞控:从电路设计到PID调参全记录

本文详细记录了使用迅为RK3588开发板DIY无人机飞控的全过程,从硬件选型、PCB设计到实时系统构建和PID调参。RK3588核心板凭借其强大的AI算力和丰富接口,成为高性能无人机控制解决方案的理想选择。文章还分享了视觉导航系统集成和实际飞行测试经验,为硬件爱好者提供实用参考。

weixin_29053577的博客 436

java linkedlist源码分析_java集合系列之LinkedList源码分析

java集合系列之LinkedList源码分析LinkedList数据结构简介LinkedList底层是通过双端双向链表实现的,其基本数据结构如下,每一个节点类为Node对象,每个Node节点包含该节点的数据和分别指向前一个前一个和后一个节点的引用。LinkedList内部维护两个成员变量first和last,分别指向链表的头节点和尾节点(接下来的成员变量介绍中会提到)。由于LinkedList基...

weixin_28961565的博客 205

1、JMP脚本编程全面指南:从基础到高级应用

本博客全面介绍了JMP脚本编程的各个方面,从JMP基础和JSL入门,到数据类型、数据结构、编程方法、数据表操作、图形与三维场景脚本,再到应用程序创建与扩展功能。内容涵盖脚本工具使用、常见任务实现、兼容性说明及未来发展趋势,旨在帮助用户掌握JMP脚本语言的强大功能,提升数据分析的自动化与定制化能力。适合从初学者到高级用户的深入学习与实践参考。

flink9streamer的博客 267

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的零售柜商品检测软件(Python+PySide6界面+训练代码)

随着新零售概念的兴起,无人零售柜、智能零售店等新型零售模式快速发展。传统零售柜依赖于人工盘点和补货,效率低下且成本高昂。本文提出了一种基于YOLO系列目标检测算法的零售柜商品检测系统,实现了对零售柜内商品的自动识别、计数和库存管理。系统采用PySide6开发用户界面,集成了YOLOv5、YOLOv6、YOLOv7和YOLOv8等多种先进的深度学习模型,提供了完整的训练和推理流程。本文将详细介绍系统设计、算法实现、数据集构建和实际应用效果,并提供完整的代码实现。

YOLO 333

死磕 java集合之LinkedList源码分析

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34249678的博客 70

执行任务赚积分

接下来N行,每行两个空格分隔的整数(SLA和V),SLA表示任务的最晚处理时间,V表 示任务对应的积分。每个任务都有最晚处理时间限制和积分值,在最晚处理时间点之前处理完成任务才可获得对应的积分奖励。现有N个任务需要处理,同一时间只能处理一个任务,处理每个任务所需要的时间固定为1。可用于处理任务的时间有限,请问在有限的时间内,可获得的最多积分。第2个时间单位内,处理任务4,获得5个积分。输入描述:第一行为一个数N,表示有N个任务,1

面试高手的博客 4697

【死磕 Java 集合】— LinkedList源码分析

【死磕 Java 集合】— LinkedList源码分析 问题 (1)LinkedList只是一个List吗? (2)LinkedList还有其它什么特性吗? (3)LinkedList为啥经常拿出来跟ArrayList比较? (4)我为什么把LinkedList放在最后一章来讲? 简介 LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为队列或者栈来使用,它是怎么实现的呢?让我们一起来学习吧。 继承体系 通过继承体系,我们可以看到L...

wangzhipeng47的博客 186

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【初探Java之路 六 】集合1-ArrayList和LinkedList的使用与源码分析

ArrayList是Java集合框架中的一个动态数组实现。它就像一个会自动扩展的魔法背包,当你往里面塞更多东西时,它会自动变大。//学号//姓名//年龄//居住地return sid;return age;/*1:用输出语句完成主界面的编写2:用Scanner实现键盘录入数据3:用switch语句完成操作的选择4:用循环完成再次回到主界面*///创建集合对象,用于保存学生数据信息//用循环完成再次回到主界面//用输出语句完成主界面的编写。

z17711802963的博客 1693

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

[Java 集合] LinkedList源码分析

[Java 集合] LinkedList源码分析 源码基于jdk 11 LinkedList是一个以双向链表实现的List,它除了作为List使用,还可以作为双端队列或者栈来使用 一、属性 //元素的个数 transient int size; //头节点 transient LinkedList.Node<E> first; //尾节点 transient LinkedList.Node<E> last; private sta

zhangsan_716的博客 217

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java linkedlist源码分析_java集合之LinkedList源码分析

一、查看类的继承关系关于Cloneable,java.io.Serializable两个接口和为什么没有实现RandomAccess接口,我们上次已经说过了,如果不是很理解,请参考上一篇文章:《java集合之ArrayList源码分析》这次重点把LinkedList源码看一遍先简单说明:LinkedList 内部是一个链表LinkedList首先会继承AbstractSequentialList,...

weixin_30610771的博客 279

【java集合】LinkedList源码分析

LinkedList是一种基于链表实现的集合类,也是经常使用到的集合。其特性归纳如下: 特性 值 是否顺序存储 顺序 是否可重复存储 可以 是否可存储null 可以 是否线程安全 非线程安全 LinkedList的属性首先列举一下ArrayList主要属性,方便大家理解和本文的说明: 属性 说明 first 链表的头部 last 链表的尾部

I am a coder 355

Java集合系列之LinkedList源码分析

一、LinkedList简介   LinkedList是一种可以在任何位置进行高效地插入和移除操作的有序序列,它是基于双向链表实现的。   ps:这里有一个问题,就是关于实现LinkedList的数据结构是否为循环的双向链表,上网搜了有很多文章都说是循环的,并且有的文章中但是我看了源代码觉得应该不是循环的?   例如在删除列表尾部节点的代码: private E unli

1442

Java集合之LinkedList源码分析

Java 集合之LinkedList源码分析 1. 概述 LinkedList最大的特点是它的数据结构,它的底层是使用链表结构实现。链表是线性表的一种。而链表又分为单向链表和双向链表,链表又有循环与非循环之分,在jdk1.6中就是使用了双向循环链表的结构,而在jdk1.7和jdk1.8中改成了双向链表,也就是取消循环了。本文主要分析jdk1.8中LinkedList的源码,当然,下面我也会放上几种...

weixin_43198403的博客 406

Java集合框架 ——— LinkedList 源码分析

LinkedList是一个基于双向链表实现的集合类,经常被拿来和ArrayList做比较。LinkedList 继承自,它决定了 LinkedList 只能支持按次序访问。此外 LinkedList 还实现了Deque接口,它具有双端队列的特性,支持从两端插入和删除元素,方便实现栈和队列等数据结构。因此 LinkedList 实现了很多队列的方法,在开发中也可以当做一个堆栈来使用。

weixin_48471044的博客 439

Java 集合体系之 LinkedList 源码分析

前言 在上一篇文章中我们分析了 ArrayList 的源码,知道了原来 ArrayList 内部是由数组来维护的。这篇文章再来分析分析 LinkedList 的源码。为了看起来方便,这篇会对源码进行拆分分析。分析之前,先来大概了解下 LinkedList。 LinkedList 的继承结构如下: LinkedList 是 List 和 Deque 接口的双向链表实现。实现了所有可

Airsaid 2431

Java集合源码分析之LinkedList

1. LinkedList简介 public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable 可以看到LinkedList类继承Abstra...

akahwfvs65943的博客 138

Java集合—LinkedList源码分析

文章目录简介结构分析源码分析构造方法方法根据位置取数据根据对象得到索引**检查链表是否包含某元素的方法:****删除方法** 简介 LinkedList实现了List和Deque接口。 实现所有可选列表操作,并允许所有元素(包括null )。LinkedList底层使用的双向链表结构使插入和删除操作更加高效。注意,LinkedList是线程不安全的。如果多个线程同时访问链接列表,并且至少有一个线程...

SUNBO、的博客 410
上一篇: Java集合源码分析—ArrayList
<天各一方>
博客等级 码龄6年 17粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值