java集合之ArrayList

时间:2024-04-13 18:54:42

ArrayList组成:

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

java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList

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

java集合之ArrayList
java集合之ArrayList
java集合之ArrayList

ArrayList自动扩充:

当添加超过10时,则会根据位运算来进行自动扩容。每次1.5倍进行扩容。
     因为底层数组默认是10,所以在添加前10个元素时,数组容量不会变。

java集合之ArrayList

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

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

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

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