ArrayList
ArrayList是我们最常使用的集合之一,使用场景通常是数据查询,因为ArrayList的底层实现是数据,通过索引就可以直接找到对应的元素。所以查询效率高
一、ArrayList的数据结构
从源码中看得出ArrayList继承了AbstractList,并且实现了List,RandomAccess(随机访问),Cloneable(克隆)和Serializable(序列化)接口。
下图更加直观的展示出了ArrayList与其他类之间的关系:
ArrayList的参数以及构造方法
- 参数
-
构造方法
「ArrayList有三个构造方法我们一个一个来进行分析」
1.ArrayList的第一种构造方法
这个构造函数只需要传入ArrayList的长度。 当我们传入大于0的长度时,会按照我们传入的长度创建ArrayList集合 当我们传入等于0的长度时,会使用到EMPTY_ELEMENTDATA,默认一个空的数组 当我们传入小于0的长度时,会直接抛出异常。
-
ArrayList的第二种构造函数
第二种构造函数无需我们传入参数,默认一个默认大小的空实例的共享空数组实例 -
ArrayList的第三种构造函数
传入一个集合,如果传入的集合中有数据则返回包含传入集合中的数据的ArrayList
-
二、增删改查操作
1.新增源码分析
图中文字有个小错误,懒得截屏编辑图片就直接文字说明了。 size+1不是扩容的下标,而是扩容的长度
2.删除源码分析
3.根据下标获取源码分析
代码如下(示例):
ArrayList的扩容机制
ArrayList的扩容是在原有的基础上扩容1.5或者2倍,但是不得超过虚拟机最大限制值,源码中有体现,如果集合按照1.5倍或者2倍扩容之后的新容量大于虚拟机的最大限制值,则会默认给虚拟机的最大限制值。
每次扩容之前都会判断是否需要进行扩容。
总结
本文主要是讲述了ArrayList的底层源码实现,如有不对的地方,可以私信我,也可以评论区发表意见。
后续还会继续补充ArrayList的底层实现