首先ArrayList的底层是Object[],所以归根结底他还是数组,不过是可以自动扩容,点进去ArrayList的源码,可看出初始的默认数组容量为10。
然后看看他的构造器,是可以传入capacity的
另一个空参构造器,当然用的就是默认容量
然后我们来看一下add代码是如何编写的
看起来是不是很简单,就只有改变当前集合长度和把数据加入进去,但是其实里面是有自动扩容的代码逻辑的
其中参数中的calculateCapacity的方法代码如下:
可以看出我们在其中会判断刚刚add之前的底层Object数组是否为Empty,如果谁的话就直接赋值为Default = 10,否则当然就是赋值为我们传入的参数+1咯。
知道了ensureExplicitCapacity的参数内部方法之后,就来研究这个方法是干啥的,直接贴源码
注意此时的minCapacity就是我们上面解释的(default或者参数+1)
这里出现了一个modCount的成员变量,点进去看看,结果就到了父类AbstractList
上面的注解大概意思是我们想要用快速迭代器,就得在add中+1,remove中减1不然会报错,这个是可选的。
看完这个modCount就可以看代码逻辑了,终于到了扩容的实现代码,核心代码就是这个grow,grow这个方法传入了我们现在add后的长度,估计得依照这个来扩容
这段代码很好看懂,首先有一个oldCapacity代表Object数组的长度,然后将他变为原来的1.5倍之后和传入的参数比较,如果minCapacity大,那就用传来的参数,如果比MAX_ARRAY_SIZE大就得进入另一个方法考虑了,这里贴出MAX_ARRAY_SIZE的数值
那我们就看看他是怎么处理容量都快超过Integer最大值的这种情况吧
可看出如果当前参数大于Max返回int的最大值,否则用较大的MAX_ARRAY_SIZE!