数据结构-ArrayList-LinkedList--java进阶day09
1.数据结构

2.栈

详细流程:https://kdocs.cn/l/claZP6piLKDW?linkname=150996989
3.队

详细流程:https://kdocs.cn/l/claZP6piLKDW?linkname=150997055
4.数组

5.链表
1.双向链表
链表是由一个个的结点连接而成的,其中一个结点内部如下图所示

前一个结点会有下一个结点的地址,根据这个特点,结点会依次连接在一起

如果要查询一个数,就得从头开始查,因此链表的查询速度很慢
链表的增删速度很快,如下图

数据B将它的下一个地址指向C,而A将它的下一个地址指向B,这样就可以连接B这个结点

详细流程:https://kdocs.cn/l/claZP6piLKDW?linkname=150997082
2.双向链表
结点中即记录了下一个结点的地址,又记录了上一个结点的地址链接起来的链表就是双向链表

双向链表对于单向链表的好处在于,它既可以从头开始查询元素,也可以从尾开始查询元素,而不像单向链表只能从头开始查询
总结

6.ArrayList

1.ArrayList长度可变原理
之前聊过ArrayList长度可变的原理,如下图

但其实第一句话存在问题,实际上ArrayList如果只创建了容器,没有做添加操作的话,它的底层数组长度为0
我们进入到ArrayList的源代码中,发现一个空参构造

其中elementData是一个object类的数组

elementData这个数组纪录着一大串英文,我们点击这串英文,进入其内部
发现这串英文也是一个object类的数组,而且这个数组静态初始化,里面一个元素都没有,说明这个数组长度为0

java将这个长度为0的空数组赋值给了elementData数组
所以,当我们创建了ArrayList这个集合容器,没有进行添加操作的话,它的底层数组默认长度为0

接下来,我们再看使用了add方法,源代码会发生什么
首先,add方法将我们添加的元素装入了e中,然后add方法里面又调用了一个新的add方法
新的add方法将“abc”(e),还有长度为0的数组,以及集合长度(size)加入形参中

需要注意,size是成员变量,现在默认长度为0
接着,继续进入到新的add方法,方法将size=0赋给了s
然后s与elementData数组的长度进行比较,两者都为0,所以是true

所以,进入到grow方法,在grow方法中将size+1作为形参又传给了grow方法

然后,接着走新的grow方法
minCapability接收到size+1(1)
grow方法将数组长度(0)赋给了oldCapability,然后进行了一个if比较

很明显,oldCapability=0,是不可能大于0的,所以继续走后面的逻辑
elementData是一个空数组,DeFAultCAPCITY....也是一个空数组,逻辑给的是!=,明显不成立,所以走else

else中使用了Math类的一个找最大值的方法,其中DEFAULT大小为10
...

....
DEFAULT与minCapability(1)进行比较,很明显前者大,所以返回了10,因此完成了添加操作后,产生了长度为10的数组

总览

接下来,我们再来聊聊数组装满了10个元素,是怎么进行扩容的
我们添加第11个元素,add方法将新元素作为e传给新的add方法
接着走if判断,此时size=10,并且数组长度也为10,满足条件,走grow方法

如上图,假如还没装满10个元素,那就走红框的逻辑,添加元素进集合
grow方法将size变为11,并传给新的grow方法
oldCapability接收数组现长度(10),然后走if判断,明显10>0,接着走红框的逻辑

上图中,“>>”是表示除以2,10/2=5
如上图,红框中三个数作为实参传入newLength方法,调用newLength方法

如上图,newLength方法调用Math类的max方法,选取最大值(1和5中挑选),也就是5,再将oldCapability和选出来的数进行相加,然后赋值给preLength
接着进行一个判断,看preLength的范围是否满足大于0,小于SOFT...如果满足就返回preLength(15)

其中SOFT大小如下图,做这个范围的判断是为了限制数组大小不能无限大

ArrayList真实大小扩容原理,如下图

7.Linkedlist

1.添加

.

2.疑问

如图,添加了一些元素到LinkedList集合,因为LinkedList实现了List集合,所以可以使用List集合中根据索引来获取元素的get方法

...

表面看似确实是用索引来获取的值,怎么就说LinkedList查询速度慢呢?
我们点开get方法的源码来看
get方法将我们的索引传入到了node方法

接着点进node方法观察
node方法将我们的索引与LinkedList集合长度右移1格(除以2)进行了判断
当索引小于操作后的集合长度时,node方法就会从头开始遍历集合一个一个找我们要找的元素

如果大于了操作后的集合长度,就从尾开始遍历集合,一个一个找我们要找的元素
最后再将找到的数进行返回
LinkedList集合使用的get方法,看似是根据索引找元素,实际是根据索引来判断元素位置离头近还是离尾近,然后遍历集合,最后才找到这个元素
数据结构-ArrayList-LinkedList--java进阶day09的更多相关文章
- java数据结构之列表——ArrayList,LinkedList,比较
刚看完<数据结构与算法分析java语言描述>的第3章中的表,下面回忆下主要知识点,主要说明各列表之间的关系,以及各自的优缺点.其中牵涉到内部类和嵌套类. 1 Collection APIp ...
- Java进阶7并发优化4——JDK并发数据结构
Java进阶7并发优化4——JDK并发数据结构20131114 由于并发程序和串行程序的不同特点,在串行程序中使用的数据结构可能无法在并行程序中直接的正常使用,因为这些数据结构可能不是线程安全的,所以 ...
- Java数据结构ArrayList
Java数据结构ArrayList /** * <html> * <body> * <P> Copyright JasonInternational</p&g ...
- Java——集合框架之ArrayList,LinkedList,迭代器Iterator
概述--集合框架 Java语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现接口的类).所有抽象出来的数据结构和操作(算法)统称为Java集合框架(Java Collection ...
- java.util.ArrayList,java.util.LinkedList,java.util.Vector的区别,使用场合.
下图是Collection的类继承图 从图中可以看出:Vector.ArrayList.LinkedList这三者都实现了List 接口.所有使用方式也很相似,主要区别在于实现方式的不同,所以对不同的 ...
- java面试题(杨晓峰)---第八讲谈谈Vector,ArrayList,LinkedList有何区别?
Vector,ArrayList,LinkedList均为线性的数据结构,但是从现实方式与应用场景中又存在差别. 1 底层实现方式 ArrayList内部数组来实现,LinkedList内部采用双向链 ...
- Difference between LinkedList vs ArrayList in Java
source-url LinkedList implements it with a doubly-linked list. ArrayList implements it with a dynami ...
- Java集合--ArrayList,LinkedList性能分析
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3308900.html 第1部分 List概括 先回顾一下List的框架图 (01) List 是一个接口 ...
- Java Collection - ArrayList & LinkedList
总结 ref: https://blog.csdn.net/qq_32679815/article/details/78907437 1-ArrayList是实现了基于动态数组的数据结构,Linked ...
- Java进阶步骤
一.基础篇 面向对象 什么是面向对象 面向对象.面向过程 面向对象的三大基本特征和五大基本原则 平台无关性 Java如何实现的平台无关 JVM还支持哪些语言(Kotlin.Groovy.JRuby.J ...
随机推荐
- Jenkins使用问题汇总
1. 禁止job出现403问题 解决方法: 在系统管理 –> Configure Global Security中调整设置:取消"启用安全(Enable security)" ...
- 一级缓存和二级缓存--mybatis|hibernate
一级缓存和二级缓存的区别: 主要的不同是它们的作用范围不同. 一级缓存是session级别的. 也就是只有在同一个session里缓存才起作用,当这个session关闭后这个缓存就不存在了. 而二级缓 ...
- 项目PMP之六项目进度管理
项目PMP之六--项目进度管理 一.定义:用于沟通和管理相关方期望的工具,可作为报告绩效的基础,说明项目的交付时间和方式 迭代型进度计划(敏捷模式):接受存在未完成项,滚动式规划管理 按需进度计划 ...
- Apollo架构设计
Apollo架构设计 Apollo有一点很好,就是它是由国内携程团队开发,而且文档写的很全,代码也完全开源.如果去了解它也可以直接去看它的官方文档. 一.配置中心概念 1.背景 在实际开发中都会与配置 ...
- nginx中的正则表达式,location路径匹配规则和优先级
前言,我这里验证的nginx-v1.23.2单机环境下的nginx中的正则表达式.location路径匹配规则和优先级. 先准备好环境,基础配置是这样 nginx/conf/conf.d/host.c ...
- 快速入门 DeepSeek-R1 大模型
国内最新的神级人工智能模型已经正式发布,没错,它就是备受瞩目的DeepSeek-R1大模型.今天,我们将对DeepSeek进行一个简单的了解,并探索如何快速使用和部署这个强大的工具.值得一提的是,De ...
- 在SOUI4中工作线程如果与UI线程交互
在SOUI4中工作线程如果与UI线程交互 很多时候程序的耗时过程需要在工作线程执行,执行过程中可能需要通过UI线程来展示运行状态及结果,这就涉及到工作线程与UI线程交互的问题. SOUI的UI框架本身 ...
- 多云时代!天翼云TeleDB以科技创新释放数据价值
8月17日,在第14届中国数据库技术大会(DTCC2023)上,天翼云科技有限公司数据库首席技术官李跃森以<天翼云TeleDB持续创新之路>为题发表演讲,介绍了天翼云TeleDB数据库的发 ...
- RocketMQ实战—8.营销系统业务和方案介绍
大纲 1.电商核心交易场景的业务流程 2.电商支付后履约场景的业务流程 3.电商营销场景的业务说明 4.电商促销活动的Push推送 5.会员与推送的数据库表结构 6.营销系统的数据库表结构 7.营销系 ...
- Luogu P7250 BalticOI 山峰 题解 [ 蓝 ] [ 模拟 ] [ 并查集 ] [ BFS ]
Luogu P7250 BalticOI 山峰. 一道大模拟,很暴力,也很难写.建议紫或蓝,标签为模拟.广度优先搜索.并查集. 思路 首先观察到答案取决于路线上的最低点,所以我们可以把所有点的高度丢进 ...