java ArrayList 源码分析

ゝ一纸荒年。 2021-09-14 07:20 561阅读 0赞

一、ArrayList组成:

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

Center

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

Center 1

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

Center 2

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

Center 3

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

Center 4

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

Center 5

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

Center 6

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

Center 7

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

Center 8

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

Center 9

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

Center 10

Center 11

二、ArrayList自动扩充:

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

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

Center 12

#

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

Center 13

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

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

Center 14

三、总结:

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

发表评论

表情:
评论列表 (有 0 条评论,561人围观)

还没有评论,来说两句吧...

相关阅读

    相关 ArrayList分析

    构造函数(有参和无参): 无参:有个被transient关键字修饰的elementData的Object类型长度为0的数组。 有参:参数的含义就是这个集合的含量,在Arra