java ArrayList 源码分析

一、ArrayList组成:

1.本身是由数组组成(Object[])+整数(size)组成

 

2.ArrayList默认容量:(无参构造)当new对象时,不带参数

 

3.ArrayList本身定义一个空数组,则会自动赋值给elementData对象数组,而后续操作都是对elementData进行操作。

 

4.因为把EMPTY_ELEMENTDATA赋值给elementData,所以初始容量为0

 

5.当执行第一次add方法时,会和传入的参数进行比对,如果小于默认值(10),则会给数组赋初始值=10。

 

6.第一次add方法时,会进行判断操作的数组(elementData)和默认空数组(EMPTY_ELELMENTDATA)是否相等,相等则跟传入的参数(minCapacity)取最大值(10)

 

7.ArrayList本身自定义默认初始值(10)

 

8.调用方法,判断添加对象的长度,是否超越默认值(10),因为第一次肯定不会超越10

 

9.会调用Arrays工具类中的copyOf方法进行赋初始值(10)

 

Integer.MAX_VALUE = 0x7fffffff 等于2147483647,也就是int的最大值2^31-1

 

10.根据泛型返回对象的数组类型,并赋值给要操作的数组(elementData)

 

二、ArrayList自动扩充:

1.当添加超过10时,则会根据位运算来进行自动扩容。每次1.5倍进行扩容。

因为底层数组默认是10,所以在添加前10个元素时,数组容量不会变。

 

添加元素超过10时,当第添加11个元素时,数组容量将会扩充到15

2.当添加元素为12个时,数组容量将会扩充到22

每次扩充都会通过Arrays.copyOf(elementData,newCapacity)来完成自动扩充

三、总结:

如果通过无参构造方法,初始容量为0,当真正的添加元素时,才会分配容量。每次按照1.5倍(位运算>>)的比率通过copyOf的方式对原来的容量进行扩充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值