LinkList源码分析

Java集合——LinkList源码 一、LinkedList数据结构 LinkdList底层是由双向链表构成的,并且头结点不存放数据。 LinkedList继承了AbstractSequentialList抽象类,由AbstractSequentialList继承了Abstract类。LinkedL实现了Deque接口,Deque接口继承了Queue接口。 Node结点 因为是双向链表,每个结点都有前驱结点和后继结点。Node结点一... 阅读详情

数据结构

底层的数据结构就是双向链表。

LinkList的继承关系

一、类的继承关系

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

说明:LinkedList继承AbstractSequentialList抽象父类,实现了List接口(规定了List的操作规范)、Deque(双端队列)、Cloneable(可拷贝)、Serializable(可序列化)。

二、成员变量

 transient int size = 0;
 transient Node<E> first;
 transient Node<E> last;
 
  // 内部类
  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;
        }
   }

成员变量 transient关键字

持有对象的引用
比如,我们创建链表的结点如下。结点中持有前驱结点和后继结点的引用,引用就是对象在内存中的地址值。对于这样的结点形成的链表,我们序列化这个链表后,结点的前序和后继引用都失效了,因为内存地址变了。这种情况下我们需要重新连接链表。

序列化与反序列化

private void writeObject(java.io.ObjectOutputStream s) throws java.io.IOException {
     // 先调用默认的序列化方法
     s.defaultWriteObject();
     
     // 序列化容量
      s.writeInt(size);

   // 只把结点中的值序列化,前序和后继的引用不序列化
    for (Node<E> x = first; x != null; x = x.next)
        s.writeObject(x.item);
    }
}

@SuppressWarnings("unchecked")
private void readObject(java.io.ObjectInputStream s) throws java.io.IOException, ClassNotFoundException {
    // 先调用默认的反序列化方法
     s.defaultReadObject();

    // 读容量
     int size = s.readInt();

   // 读取每一个结点保存的值,创建新结点,重新连接链表。
     for (int i = 0; i < size; i++)
         linkLast((E)s.readObject());
    }
}

三、构造函数

public LinkedList() {}

public LinkedList(Collection<? extends E> c) {
  this();
  addAll(c);
}

四、get(i)方法

public E get(int index) {
   //校验是否越界
   checkElementIndex(index);
   return node(index).item;
}

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

通过 index值,遍历范围 size 的前半/后半。

队列提供方法

Deque

Deque接口定义了在双端队列两端访问元素的方法.

第一个元素(头部)最后一个元素(尾部)
抛出异常特殊值抛出异常特殊值
插入addFirst(e)offerFirst(e)addLast(e)offerLast(e)
移除removeFirst()pollFirst()removeLast()pollLast()
检查getFirst()peekFirst()getLast()peekLast()

Queue

.LinkedList可以作为FIFO(先进先出)的队列,作为FIFO的队列时,下表的方法等价:

队列方法等效方法
add(e)addLast(e)
offer(e)offerLast(e)
remove()removeFirst()
poll()pollFirst()
element()getFirst()
peek()peekFirst()

stack

LinkedList可以作为LIFO(后进先出)的栈,作为LIFO的栈时,下表的方法等价:

栈方法等效方法
push(e)addFirst(e)
pop()removeFirst()
peek()peekFirst()
ExpressLRS 915MHz vs 2.4GHz:实测对比与TX12遥控器的最佳搭配方案 本文深入对比了ExpressLRS 915MHz与2.4GHz两种频段在穿透能力、延迟、抗干扰等方面的实测表现,并结合RadioMaster TX12遥控器的硬件特性,提供了从微型花飞到极限远航等不同场景下的最佳搭配方案与EdgeTX系统配置指南,帮助FPV玩家根据核心飞行需求做出精准选择。 阅读详情

相关推荐

用FPGA驱动WS2812B点阵,手把手教你实现动态文字显示(附完整Verilog代码)

本文详细介绍了如何使用FPGA驱动WS2812B点阵实现动态文字显示,包括硬件连接、Verilog代码实现和动态效果设计。通过精确的时序控制和数据处理,读者可以掌握FPGA与WS2812B的交互技术,并实现炫酷的显示效果。附完整Verilog代码,适合硬件爱好者和工程师参考实践。

weixin_30482383的博客 669

LinkedList源码分析(超详细)

先学 ArrayList 再学 LinkedList,面试官:“这小子,有两把刷子。”

一条咸鱼的博客 1152

西门子1200,与V90和步科MD60第三方伺服PN通讯

需要注意的是回零方式的选择,因为V90是绝对值编码器,这里回零模式选择模式7,系统自动根据编码器反馈以及组态的机械参数,计算出轴的位置,并且掉电保持。在线访问中,找到对应的网卡,以及下面扫描到的设备,可以在线修改ip地址和profinet名称,注意一定要和组态中的完全一致。以上硬件组态上完成,主要是gsd文件导入后,添加硬件,建立连接,修改ip和profinet名称,添加报文。1- 博图V18内,设备组态,网络视图中,拖入V90以及MD60伺服,并与PLC创建连接。向厂家索要GSD文件,PN的描述文件。

weixin_37596954的博客 2463

java集合之家——LinkList(源码)

前面分析了ArrayList,可知它的底层实现就是一个普通数组而已,用到的数据结构就是顺序表。虽然说对于随机访问效率是还可以的,但是如果要进行插入删除的的话,因为要移动大批的元素,导致性能非常地差,所以我们不得不研究出另一种数据结构,可以高效率的实现插入删除,这个数据结构就是链表。而今天的LinkList就利用了双向循环链表实现了这个数据结构。下面我们就来看看源码。 类声明: public cl...

weixin_43272605的博客 853

slew dreate,slew threshold与transition计算

​只看rise情况下,from pin取slew threshold10%-90%的区间,slew derate为1,计算得到transition为1.002e-10,to pin的slew threshold 为30%-70%,slew derate 0.5,从波形列表上取相近的值3.75e-10和8.75e-10,计算得到transition为(8.75e-10-3.75e-10)/0.5=1e-9,考虑精度和取值区间问题,基本符合工具计算的值,如下:​。如下示例,在.lib库中有定义以下内容。

m0_61544122的博客 793

拆开它的“身体”,看懂割草机器人的五层系统架构

这篇文章深入解析了智能割草机器人的五层系统架构。机械层采用铝合金一体式车架和独立悬挂刀盘系统;电子层配备双处理器和多种传感器;固件层实现毫秒级安全响应;算法层融合多种定位技术实现厘米级精度;云服务层提供远程管理和AI优化。这套系统通过精密协同实现了智能割草的全流程闭环,展现了从机械结构到云端智能的完整技术栈,为户外智能设备设立了新的技术标杆。

智能硬件研发,欢迎交流 198

【JDK1.8】JDK1.8集合源码阅读——LinkedList

一、前言 这次我们来看一下常见的List中的第二个——LinkedList,在前面分析ArrayList的时候,我们提到,LinkedList是链表的结构,其实它跟我们在分析map的时候讲到的LinkedHashMap的结构有一定的相似,但是相对简单很多,今天再详细的看一下它的具体结构,以及使用的场景等。 二、LinkedList结构概览 在看具体的结构之前我们先来看一下它的继承关系: 与Ar...

weixin_34308389的博客 285

在Ubuntu上安装Node.js编程

在Ubuntu操作系统上安装Node.js是非常简单的,本文将为您提供详细的安装步骤。这是一个简单的Node.js HTTP服务器示例,它将在本地主机的端口3000上监听请求,并返回"Hello, World!npm是Node.js的包管理器,您可以使用它来安装和管理Node.js模块。您已成功在Ubuntu上安装了Node.js,并创建并运行了一个简单的Node.js应用程序。现在,您已经成功安装了Node.js和npm,让我们创建一个简单的Node.js应用程序并运行它。如有任何疑问,请随时提问。

CodeNexus的博客 3524

LinkList的底层源码分析

1.LinkList底层维护了一个双向链表2.LinkList中维护了两个属性first和last,分别代表首节点和尾节点3.LinkList的每个节点又维护了prev,next,item三个属性,其中通过prev指向前一个节点,next指向后一个节点,item存放节点的数据4.可以添加任意元素并且可以重复5.LinkList是线程不安全的。

weixin_52911655的博客 400

OpenCV计算机视觉实战(3)——计算机图像处理基础

本文全面介绍了计算机视觉和数字图像处理的基础知识。从最基本的像素概念入手,详细讲解了图像在计算机中的表示方式,包括RGB、CMYK等色彩空间的工作原理及其应用场景。还系统分析了常见图像和视频文件格式的特点,梳理了计算机图像处理技术的发展历程,并重点介绍了OpenCV这一强大的开源计算机视觉库的功能与应用领域。

qq_30167691的博客 1740

飞牛fnNAS搭建web版微信

摘要:本文介绍了一种通过Docker在飞牛NAS上部署微信客户端的方法,实现24小时同步微信聊天记录。具体步骤包括:1)激活飞牛NAS的Docker功能并配置镜像加速源;2)创建专用文件夹并下载docker-wechat镜像;3)设置容器参数并部署微信客户端;4)通过局域网或ZeroTier内网穿透实现远程访问。相比传统Windows/Linux方案,该方法资源占用更低,适合需要长期保存微信聊天记录的用户。

dgnankai的专栏 3332

LInkList 源码分析

1.集合结构: 考虑几个个问题: 1.概述 2.重要方法实现 add方法: remove元素: 修改元素: 查找元素 3.重要特性: 迭代方式, 扩容集合 4.使用场景: 对1:概述 如上图:实现dequar接口,集成AbstractequencnitonLi...

专注Java(全栈)应用开发,求知若渴,虚心若愚,talk is cheap, show me the code. 239

Android16 自定义HAL层适配一些VINTF和SELINUX问题修改

在RK里面一般权限矩阵在/rockchip/common/manifests/目录,我这版Android16的代码比较特殊,这里重点修改/device/rockchip/rockchip_generic/manifests/frameworks_compatibility_matrix.xml这个文件,不同的版本注册方式不同,在。hal_ruip_default.te,hal_ruip.te,attributes文件。拓展策略的方式添加,但是在Android16里面发现用不了。发现HAL层服务注册成功了。

tzj1058756809的博客 242

java - LinkList源码分析

LinkList源码分析前言一、接口实现二、成员变量Node内部类三、list类型方法boolean add(E e)void addFirst(E e)void addLast(E e)void add(int index, E element)boolean addAll(Collection<? extends E> c)与boolean addAll(int index, Collection<? extends E> c)E remove()E remove(int ind

qq_30390613的博客 739

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

JDK源码分析系列---ArrayList和LinkList

ArrayList和LinkList的源码分析 概要 ArrayList和LinkList是常用的存储结构,不看源码先分析字面意思,Array意思是数组,可知其底层是用数组实现的,Link意思是链接,可知是以链表实现,这两种数据结构各有什么特点呢?在实际开发中,我们要如何选择? 1.ArrayList ArrayList是实现了List接口的可变数组,即动态数组,它不仅实现了List的可选操作,...

weixin_47143210的博客 197

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

从源码分析ArrayList和LinkList的区别

从java源码分析ArrayList和LinkList之间的不同

u012734441的专栏 1358

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Java基础之LinkList 源码分析

LinkedList 查找 linkedList 底层是基于链表 结构的,无法像ArrayList那样随机访问指定位置元素。LinkedList查询过程要稍微麻烦一些,需要从链表头(或者尾结点)向后查找 时间复杂度为o(n) 主要是通过遍历的方式定位目标位置的节点后,取出节点储存的值然后返回。在源码有个优化的地方,就是比较要查询的节点即index 与阶段数量size的一半 的大小,决定是从头节点查询还是从尾结点查询 源代码如下: public E get(int index) { //检查i

weixin_42419325的博客 326

jdk源码分析书籍_JDK源码分析:ArrayList和LinkList

ArrayList和LinkList是常用的存储结构,从字面语义可知Array意思是数组,可知其底层是用数组实现的,Link意思是链接,可知是以链表实现,这两种数据结构各有什么特点呢?在实际开发中,我们要如何选择?1. ArrayListArrayList是实现了List接口的可变数组,即动态数组,它不仅实现了List的可选操作,同时允许元素为null,它提供了一些方法来操作数组的大小来...

weixin_30303839的博客 109

java 集合ArrayList及LinkList源码分析

首先是ArrayList的继承体系,代码如下: Java代码 publicclassArrayList&lt;E&gt;extendsAbstractList&lt;E&gt; implementsList&lt;E&gt;,RandomAccess,Cloneable,java.io.Serializable public class ArrayList&l...

kanwoerzi 214
上一篇: ArrayList源码分析
下一篇: Java基础-泛型
FLY翔仔
博客等级 码龄7年 1粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值