Java集合框架剖析(4)——LinkedList

Java集合源码剖析 Java集合源码剖析 ArrayList 底层结构:ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素(动态数组)。 ArrayList底层是数组,允许元素是null,能够动态扩容 size、isEmpty、get、set、add 等方法时间复杂度都是 O (1) 非线程安全,并发修改时,会抛出ConcurrentModificationException 初始化 ArrayList<E> 阅读详情

这里写图片描述

  • LinkedList是一个继承与AbatractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。
  • LinkedList实现了List接口,能对它进行队列操作。
  • LinkedList实现了Deque接口,即能将LinkedList当作双端队列使用。
  • LinkedList实现了java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

顺便说一下LinkedList的父类AbstractSequentialList
这里写图片描述
虽然LinkedList没有实现RandomAccess接口,但是其父类AbstractSequentialList实现了get、set、add、remove方法

这些接口都是随机访问List的,LinkedList是双向链表,既然它继承与AbstractSequentialList,就相当于已经实现了“get(int index)”这些接口,可以支持随机访问了。

此外,如果我们需要通过AbstractSequentialList实现一个自己的列表,只需要扩展此类,并提供listIterator()和size()方法的实现即可。若要实现不可修改的列表,则需要实现列表迭代器的hashNext、next、hashPrevious、previous和index方法即可。

下面先总览一下LinkedList的构造函数和API:
这里写图片描述

LinkedList包含三个重要的成员:first、last和size:first是双向链表的表头,last是双向链表的尾节点,size是双向链表中的节点个数。
这里写图片描述

这里先说一下transient关键字的用法:
一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,可以不必关系具体序列化的过程,
只要这个类实现了Serilizable接口,这个的所有属性和方法都会自动序列化。但是有种情况是有些属性是不需要序列号的,所以就用到这个关键字。
只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。

源码剖析

属性

这里写图片描述
其中Node是一个内部类:
这里写图片描述
参数为前一个节点,元素,后一个节点

构造函数

这里写图片描述
依然是规范了两种构造函数

头尾节点的添加

这里写图片描述
这里写图片描述
其中的判定f==null表示此时的链表为空, modCount为Modified Count的缩写,表示修改次数。

头尾节点的删除

这里写图片描述
public接口,供外部调用
这里写图片描述
这里写图片描述

获取头尾节点

这里写图片描述

判定是否在链表中,以及index获取

这里写图片描述
这里写图片描述
循环遍历,O(1)时间复杂度

add、remove

这里写图片描述
都是已元素为参数的,并且满足一个即返回

addAll、clear

这里写图片描述
这里写图片描述

随机位置操作

这里写图片描述
这里写图片描述
都是循环遍历的方式,所以如果用随机位置循环来遍历LinkedList的话,那真是脑门被门夹了。

搜索操作

这里写图片描述
这里写图片描述

Queue操作

这里写图片描述

DeQueue操作

这里写图片描述
这里写图片描述
这里写图片描述

迭代器

LinkedList的迭代器分为双向迭代器(ListItr)和前向迭代器(DescendingIterator)

双向迭代器

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
都是链表的基本操作

前向迭代器

这里写图片描述
前向迭代器的next其实获取的是previous

总结

  1. LinkedList是通过双向链表去实现的。 从LinkedList的实现方式中可以看出,它不存在容量不足的问题,因为是链表
  2. LinkedList实现java.io.Serializable的方式。当写入到输出流时,先写入“容量”,再依次写出“每一个元素”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。
  3. LinkdedList的克隆函数,即是将全部元素克隆到一个新的LinkedList中。
  4. 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。
  5. LinkedList可以作为FIFO(先进先出)的队列,作为FIFO的队列时,下标的方法等价:
    这里写图片描述
    1. LinkedList可以作为LIFO(后进先出)的栈,作为LIFO的栈时,下表的方法等价:
      这里写图片描述

遍历方式

1 .for方式
2. 迭代器方式
3. 快速随机访问

LinkedList适合for和迭代器,如果用快速随机访问的话那么复杂度是O(n)
再次强调一遍不要用随机访问遍历LinkedList

HTML5网页基础设计——课程介绍专栏 案例: 参考代码: <!doctype html> <html> <head> <meta charset="utf-8"> <title>动手实践</title> <style> *{ margin: 0; padding: 0; font-size:14px; } dd{ width: 461px; height: 145px; margin: -4px; pad. 阅读详情

相关推荐

Windows 11 上 WSL2 安装 Ubuntu 22.04 保姆级教程(含桌面环境配置)

本文提供在Windows 11上通过WSL2安装Ubuntu 22.04并配置桌面环境的详细教程。涵盖WSL2核心安装、性能调优、Xfce桌面环境部署以及开发环境集成,帮助开发者构建高效、无缝的Windows-Linux混合开发工作站。

Jerry的专栏 633

JavaScript 单链表的简单实现以及操作(JavaScript 数据结构-链表)

链表用来存储有序的元素集合,与数组不同,链表中的元素并非保存在连续的存储空间内,每个元素由一个存储元素本身的节点和一个指向下一个元素的指针构成。当要移动或删除元素时,只需要修改相应元素上的指针就可以了。 //构建Node function Node(element) { this.element = element; this.next = null; } //构建LinkList function LinkList() { this.head

ySFRaabbcc的博客 325

无刷直流电机矢量控制(四):基于滑模观测器的无传感器控制

无刷直流电机矢量控制,采用转速、电流双环控制,电流环dq解耦,d轴采用id=0控制,q轴采用转速外环。采用滑模观测器(SMO),根据电压电流信息进行电机位置角度动态估算,模型可直接运行,转速和角度跟踪精度较高。 本文整理了该方法的基本原理,介绍了在MATLAB/Simulink中的建模和仿真过程,最后附上完整的模型文件。 一、基本原理 滑模观测器(下文简称SMO)是基于滑模变结构控制方法的一种状态观测器。其针对无刷直流电机转子位置估算的实现过程如下。 假设采用矢量控...

Forster-C的博客 6865

LinkedList

LinkedList 特点: 1.非同步,线程不安全; 2.支持null元素,元素可以重复; 3.可以被当作堆栈、队列或双端队列进行操作。 4.实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。 5.LinkedList包含两个重要的成员:header 和 size。 LinkedList也实现了List接口,相对于ArrayList来说...

qq_45368183的博客 181

STM32F103模拟SSI时序解析:实现高精度绝对式编码器位置读取

本文详细解析了如何在STM32F103微控制器上通过软件模拟SSI协议时序,实现高精度绝对式编码器的位置读取。文章从项目驱动出发,深入剖析了SSI通信原理、硬件电平转换连接、核心软件模拟代码实现及关键时序参数调试方法,并提供了使用示波器进行波形对齐与优化的实战指南,为成本敏感型工业控制与机器人项目提供了高性价比的解决方案。

weixin_29196315的博客 141

手把手教你用 Cursor 写一个完整的 Web 应用(含前后端 + 部署)

本文介绍如何利用Cursor AI工具从零开发一个完整的全栈待办事项Web应用。文章针对开发者常见痛点——无法独立完成项目闭环,提供了一套AI驱动的全栈开发范式。通过Vue3+Node.js+MySQL技术栈,全程由Cursor自动生成项目架构、前后端代码、数据库设计,并解决联调、部署等关键问题。重点展示了如何用AI完成:项目规划与架构设计、后端接口开发、前端页面实现、跨域联调、打包优化及云端部署全流程。该方法将传统需要3-5天的开发工作压缩至1小时内完成,产出规范可上线的项目,特别适合想突破"碎

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 633

java linkedlist 序列化_Java集合-LinkedList源码分析

1.数据结构-链表链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer)。使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。链表的类型:单向链表:单...

weixin_34737524的博客 423

统计学习导论(ISLR) 第四章分类算法课后习题

统计学习导论(ISLR) 参考资料: The Elements of Statistical Learning An Introduction to Statistical Learning 统计学习导论(ISLR)(二):统计学习概述 统计学习导论(ISLR)(三):线性回归 统计学习导论(ISLR)(四):分类 ISLR统计学习导论之R语言应用(二):R语言基础 ISLR统计学习导论之R语言应用(三):线性回归R语言代码实战 ISLR统计学习导论之R语言应用(四):分类算法R语言代码实战 统计学习导论

阿里云专家博主、数据科学领域优质创作者、统计er在读 2万+

java集合之LinkedList继承的图

我们上一次说到List的ArrayList,我们这次去看下LinkedList—顾名思义是链表,链表的优点就不用说了吧,增删效率比较高(具体的朋友们上网看吧),先来看下LinkedList的整体构架: ...

qq_43170213的博客 5041

HandwrittenMathFormulaRecognition:基于YOLOv8的手写数学公式识别系统

输入:包含手写数学公式的图像(拍摄的板书、作业纸等)输出:对应的数字文本形式的数学公式(如LaTeX格式或文本表达式)标准的手写数学表达式数据集,包含在线轨迹及图片,广泛用于公式识别研究。包含近10万对公式图片及对应的LaTeX标注,适合训练公式识别模型。MathBrush公开手写数学公式图像数据集,含多种书写风格。手写数字与符号数据集(MNIST及其扩展)用于基础数学符号的训练。

YOLO 283

基于深度学习YOLOv8的PCB板缺陷检测系统

基于YOLOv8的PCB板缺陷检测系统,可以有效提高PCB生产过程中的检测效率。未来,我们可以进一步优化模型,结合更多的数据增强策略和先进的网络结构,以适应更复杂的生产环境。为了进行训练,理想的数据集应包含多种不同缺陷类型和不同背景的PCB图像。YOLOv8需要的数据格式为每个图像一个标签文件,每个标签文件包含缺陷的类别及其边界框坐标。运行该界面时,用户可以通过点击按钮选择图像,随后系统将自动检测图像中的PCB缺陷并显示结果。训练完成后,可以使用训练好的模型进行推理,检测新的PCB图像中的缺陷。

YOLO 1069

java的linkedlist_Java LinkedList的实现原理

LinkedList是Java List类型的集合类的一种实现,此外,LinkedList还实现了Deque接口。本文基于Java1.8,对于LinkedList的实现原理做一下详细讲解。一、LinkedList实现原理总结LinkedList的实现原理总结如下:①数据存储是基于双向链表实现的。②插入数据很快。先是在双向链表中找到要插入节点的位置index,找到之后,再插入一个新节点。 双向链表查...

weixin_34276402的博客 346

PyTorch实战(2)——使用PyTorch构建神经网络

在本节中,我们使用 PyTorch 在简单数据集上构建了一个神经网络,训练神经网络来映射输入和输出,并通过执行反向传播来更新权重值以最小化损失值,并利用 Sequential 类简化网络构建过程;介绍了获取网络中间值的常用方法,以及如何使用 save、load 方法保存和加载模型,以避免再次训练模型。

盼小辉丶的博客 1万+

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Java集合源码剖析(一)【集合框架概述、ArrayList、LinkedList

加入社区:https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0// 获取index位置的元素// 设置index位置的值为element。并返回index位置的原始值// 将“元素e”添加到Vector最后。modCount++;// 删除Vector中的元素o// 在index位置添加元素element// 删除index位置的元素,并返回index位置的原始值modCount++;

2401_86963643的博客 1294

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【java集合框架源码剖析系列】java源码剖析之LinkedList

注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本。 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识。 一LinkedList类的定义: public class LinkedList extends AbstractSequentialList implements List,

(* ̄︶ ̄) 1653

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Java集合源码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】

现在正是金三银四的春招高潮,前阵子小编一直在搭建自己的网站,并整理了全套的**【一线互联网大厂Java核心面试题库+解析】:包括Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等**《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门,即可获取!Vector的模板数组。所谓模板数组,即可以将T设为任意的数据类型。

2401_84150165的博客 1036

【Java集合源码剖析】LinkedList源码剖析

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

兰亭风雨的专栏 1万+

《深入 Java 集合框架源码剖析:揭开ArrayList&LinkedList&HashSet&HashMap的神秘面纱》

Java 集合

dj12znznznsnsnns的博客 1331

Java集合框架源码探秘:ArrayList与LinkedList性能对比剖析

ArrayList和LinkedList各有优劣,没有绝对的"更好"选择。ArrayList在大多数场景下表现更优,特别是需要频繁随机访问时。而LinkedList在特定的插入删除密集型场景中表现更好。选择建议- 80%的情况下,ArrayList是更好的选择- 当需要实现队列或频繁在列表中间插入删除时,考虑LinkedList- 在不确定时,通过基准测试做出数据驱动的决策理解这两种数据结构的底层实现和性能特征,有助于我们根据具体需求做出最合适的技术选型,写出更高效的Java代码。

ql010204的博客 1451

Java集合源码剖析之LinkedList

Java集合源码剖析之LinkedList1 LinkedList概括1.1 特性1.2 数据结构2 LinkedList源码剖析2.1 继承关系2.2 元素节点2.3 成员属性2.4 构造方法2.5 核心方法2.5.1 添加元素2.5.2 查询元素2.5.3 修改元素2.5.4 删除元素2.5.5 其它方法 1 LinkedList概括 1.1 特性 LinkedList是基于双向链表实现的有序...

Java大数据联盟 274

Java集合框架深入解析:ArrayList & LinkedList

本文解析 Java 中 ArrayList 和 LinkedList 核心差异:ArrayList 基于动态数组,1.5 倍扩容、随机访问快(O (1))但增删慢,有 Fail-Fast 机制;LinkedList 基于双向链表,无需扩容,头尾增删快(O (1))但随机访问慢(O (n)),内存开销更高。选型优先 ArrayList,仅高频头尾操作 / 队列场景选 LinkedList。带有诸多代码解析以及代码注释解释

2301_80567343的博客 1125

java集合框架List子接口之LinkedList源码剖析

LinkendList是一个双向链表 , 并且实现了Deque接口 , 可以作为一个队列来使用 , 虽然LinkendList是线性结构 , 但是数据的存储并不是按照线性的接口来存储的 , 而是在每一个节点里存数据及下一个节点的地址, 同时实现了Cloneable接口 , 支持拷贝 , 并且实现了java.io.Serializable支持序列化和反序列化Cloneable , Serializable接口直通车 : java框架集合List子接口之ArrayList源码剖析数据结构直通车 : 数据结构之

刘跃辉的博客 9万+

Java集合框架面试

将元素放在table数组上面,是用hash值%数组大小定位位置,而HashMap是用hash值&(数组大小-1),却能和前面达到一样的效果,这就得益于HashMap的大小是2的倍数,2的倍数意味着该数的二进制位只有一位为1,而该数-1就可以得到二进制位上1变成0,后面的0变成1,再通过&运算,就可以得到和%一样的效果,并且位运算比%的效率高得多。get也很简单,key通过hash定位到segment,再遍历链表定位到具体的元素上,需要注意的是value是volatile的,所以get是不需要加锁的。

可小辉的博客 1777

Java集合之LinkedList源码篇

Java集合之LinkedList源码解析

个人博客,欢迎收藏。 1237
上一篇: Java集合框架剖析(3)——ArrayList
下一篇: Java集合框架剖析(5)----fail-fast机制
sicofield
博客等级 码龄18年 169粉丝 169原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值