集合框架----源码解读ArrayList篇
创始人
2024-04-13 17:51:37

1.ArrayList

ArrayList是继承AbstractList List

接口的可调整数组实现。实现所有可选的列表操作,并允许所有元素,包括null。除了实现List接口之外,该类还提供了一些方法来操作内部用于存储列表的数组的大小。(这个类大致相当于Vector,只是它是非同步的。)
size、isEmpty、get、set、iterator和listIterator操作在恒定时间内运行。加法运算在平摊常数时间内运行,也就是说,加n个元素需要O(n)时间。所有其他操作都在线性时间内运行(粗略地说)。与LinkedList实现相比,常量系数较低。
每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少与列表大小一样大。随着元素被添加到数组列表中,它的容量会自动增长。除了添加一个元素具有恒定的平摊时间成本之外,没有指定增长策略的细节。
应用程序可以在添加大量元素之前使用ensureCapacity操作增加ArrayList实例的容量。这可能会减少增量再分配的数量。
注意,这个实现不是同步的。如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组的大小的任何操作;仅仅设置元素的值并不是结构修改。)这通常是通过在自然封装列表的某些对象上同步来实现的。如果不存在这样的对象,则应该使用集合“包装”列表。synchronizedList方法。这最好在创建时完成,以防止意外的不同步访问列表:
列表列表=集合。synchronizedList(新ArrayList(…));
这个类的迭代器和listIterator方法返回的迭代器是快速失败的:如果在迭代器创建后的任何时候,以除了迭代器自己的remove或add方法以外的任何方式对列表进行了结构修改,迭代器将抛出ConcurrentModificationException异常。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是在未来不确定的时间发生任意的、不确定的行为。
注意,迭代器的快速失败行为不能得到保证,因为一般来说,在存在不同步的并发修改时,不可能做出任何硬保证。快速失败迭代器尽可能地抛出ConcurrentModificationException。因此,编写一个依赖于此异常的程序是错误的:迭代器的快速失败行为应该只用于检测误。

 当我们new一个 ArrayList,我们去看一下他的无参构造器

 再点击DEFAULTCAPACITY_EMPTY_ELEMENTDATA

我们发现这就是一个数组,由此可以得出  ArrayList就是一个数组。

2.ArrayList的add方法

进入add方法,下面就是尺寸加1,不知道他为什么扩容,我们也不知道为什么扩容,我们再进入ensureCapacityInternal方法看一下 

 进入这个方法我们就是把这个集合的最小容量传进去了,我们进入calculateCapacity方法

当ArrayList是空的时候,就去判断如果最小容量,比默认容量10小,就返回10

我们拿到10去 ensureExplicitCapacity 方法 进入grow方法,这个方法也就是扩容方法

 老的容量是0,因为我们之前没有扩过容,就是0,

  新增的容量 等于 0+0>>1=0,0右移一位加0,新的容量就是0,右移一位,可以理解为除以2但是不能当做除以2

 如果新容量-最小容量<0 ,就把最小容量给新的容量大小。现在新的容量应该是10

如果 10-数组的最大尺寸>0  ,执行newCapacity = hugeCapacity(minCapacity); 

 利用Arrays.copyOf(elementData, newCapacity); 数组复制方法把新的容量复制给空数组

 把第一个元素放到0的位置

 总结:

ArrayList的add方法底层实现原理:

1.判断是否需要扩容

默认给我们数组初始化容量==10;

2.直接通过index赋值

3.ArrayList的扩容如果1.5倍(理论的)

4.扩容其实就是生成一个新的对象

15.>>1 不是等于7.5而是等于7 。在机器里面是没有0.5这个概念的

3.ArrayList的get方法

 检查边缘,也就是是否越界

如果下标大于尺寸就会报数组下标越界异常

 没有越界就把对应的坐标的数据返回回去

 总结:get方法

1.判断数组下标是否越界

2.根据下标获取数组内容

 4.ArrayList的remove方法

检查下标是有问题,

 记录ArrayList结构修改次数,默认是0

 获取该坐标的元素

 我们进入这个缩容方法

打开api文档搜索这个方法 ,如果你没有api文档 我的开源仓库有

note/java/jdk api 1.8_google.CHM · Royalreairman/learn-computer - Gitee.com

 

 缩容原理:从删除下标后一位开始复制给要删除哪一位,最后一位变成null

总结:

删除实际上就是删除对应的下标index,删除后,后面的自动补齐。

remove方法我们发现ArrayList一个缺点,只要扩容过,无论我们这么缩容,他能装的数据还是最大的扩容数据,也是官方简绍的结构修改是添加或删除一个或多个元素,或显式调整支持数组的大小的任何操作;仅仅设置元素的值并不是结构修改

5.数组的时间复杂度(查询)

O(1): 基于数组下标index查询只要一次

O(n): 从头查询到尾部的次数 根据元素来查询 效率低

6.ArrAyList总结

1.ArrayList底层基于数组实现,根据index下标查询效率非常高

2.增、删底层基于数组实现的扩容,缩容 效率也很低

3.修改是方法是如果是根据index下标来修改所以效率高

4.无法对结构进行修改

5.每次缩容扩容会生成新的对象

6.不是同步的。如果多个线程并发访问一个ArrayList实例,并且至少有一个线程在结构上修改了该列表,那么它必须在外部同步。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
tag是什么意思 tab是什么... 一、B端基础控件的认识控件一词,直译的话可以翻译成 “用来控制的元件”,是我们对 B 端系统进行信息...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...