欢迎光临散文网 会员登陆 & 注册

ArrayList集合解析(1.8版本)

2023-06-23 21:14 作者:摆动滴呆毛  | 我要投稿

ArrayList的底层数据结构是动态数组。

特点是,容量可以改变,可以通过索引获取数据,数据存入顺序为有序

初始容量

ArrayList的初始容量为0

一开始通过无参构造创建ArrayList时,会创建容量为0的Object数组,

图中elementData是一个引用类型为Object数组的成员变量,右边是一个空数组。

DEFAULTCAPACITY_EMPTY_ELEMENTDATA也是一个成员属性


那ArrayList是什么时候有才开始有容量的呢?

答案是第一次使用add方法存入数据的时候

首先进入add方法

size参数表示当前数组里有几个元素,+1表示增加最小容量

进入ensureCapacityInternal方法

然后在进入calculateCapacity

第一次初始化就在这里了,它会先判断当前数组的地址是不是等于空数组的地址,如果为true

会进行容量的大小比较返回最大的那个值,DEFAULT_CAPACITY是成员常量,是一个int 类型,值为10。因为是第一次比较,10一定比minCapacity大,所以返回10。


然后在进入ensureExplicitCapacity

它会判断最小扩容容量是否大于当前数组的大小,如果大于0表示已经超过当前数组的大小了

就要进行扩容方法

oldCapacity表示旧容量也就是当前数组的大小

int newCapacity = oldCapacity + (oldCapacity >> 1)的意思是老容量的大小加上老容量的一半

右移一位表示除以2的意思。

然后进行判断,如果newCapacity-minCapacity<0表示扩容了1.5倍还是不够,那就已最小容量为准,然后进行数组的拷贝,这样数组就动态扩容了。



ArrayList集合解析(1.8版本)的评论 (共 条)

分享到微博请遵守国家法律