java 数据结构 ArrayList源码底层 LinkedList 底层源码 迭代器底层

文章目录

数据结构


对于数据结构我这边只告诉你右边框框里的

栈的特点:后进先出,先进后出,入栈也成为压栈,出栈也成为弹栈
栈就像一个弹夹

队列先进先出后进后出
队列像排队


链表查询满 但是增删快(相对于数组而言)

拓展:还有一个双向链表 他在查询元素的时候更快些,因为他在拿到一个元素后先判断离头结点近一点还是尾结点

总结

ArrayList源码底层

ArrayList用空参构造创建对象.在底层创建一个默认长度为0的数组elementData(数组名) 然后有一个size指向元素
添加第一个元素的时候,底层才会创建一个新的长度为10的1数组`

数组存满的时候回添加一个新数组 新数组是老数组长度的1.5倍 并且会把老数组的内容拷贝过去

size有两个含义:一个是集合长度 一个当他完成存储他会指向下次存入的位置
如果一次添加多个元素,1.5倍放不下,则新创建数组的长度以实际为准

上图为添加一个元素的经过的流程

上图为长度为10的数组装满如何扩容
minGrowth是至少要增加的容量
prefGrowth是默认新增容量的大小.就是老容量的1.5倍

LinkedList



独有api,了解即可,因为这些方法,Collectoin都可以实现

底层源码

LinkedList底层是一个双向链表所以他有
空参构造的成员位置有size和first last 头结点为节点.当掉用空参构造就会自动生成这些

node有三个成员变量

item现在要存储的数据

next 下一个结点要记录的地址值

prev我要记录前一个结点的地址值


空参构造创建完对象就是上图的样子

添加了一个结点

添加第二个元素的操作

添加第三个.元素添加完毕

迭代器底层

获取迭代器对象后相当于创建自己内部类对象(Itr)

内部类有三个成员变量

cursor指针默认初始化0

lasRet刚刚操作索引的位置

hasNext判断原理

指针跟size比较直到指针为3



上面源码就是为什么使用集合的方法太你家删除元素会报错的原因.因为modCount在使用add或者remove会自增 最后他会拿着一开始modCount的值跟最新变化次数作比较 如果不一样就会报错

相关推荐
杜大哥18 分钟前
python程序:如何查看电脑【电池电量的剩余百分比】 和 【是否插入连接着充电器】?
开发语言·python
wuyk55519 分钟前
Python网络爬虫入门到实战 第01章:爬虫到底是什么?原理、流程、合法性、风险全解析(零基础必看)
开发语言·爬虫·python
信誓旦旦的程序猿26 分钟前
【量化系统从零构建 #04】存储设计:选型·建库·交易日历
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
yurenpai(27届找实习中)26 分钟前
Java 10 的 var 为什么不能随便用?从订单汇总看懂类型推断与泛型陷阱
java·开发语言·java18
shmily麻瓜小菜鸡1 小时前
JS/TS 易踩坑知识点 — 模块化与工程化类
开发语言·javascript·ecmascript
geovindu1 小时前
CSharp: Observer Pattern
开发语言·后端·观察者模式·设计模式·c#·.netcore·行为模式
Flynt1 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
郝学胜-神的一滴2 小时前
C++11 工程级应用 09:告别无谓拷贝,解锁高性能移动语义
开发语言·数据结构·c++·vscode·软件工程·visual studio
2601_965742222 小时前
全媒体运营与短视频代运营,两者有什么区别?
大数据·数据结构·人工智能·算法·ai·媒体
Tangyuewei2 小时前
给老 Spring 项目装个 AI Agent
java·人工智能·spring