我们知道在使用ArrayList时,我们无需关心他的大小,只需要往里放置对象即可,那么它是如何做的空间自动扩充的呢?
首先,我们在构造函数中可以传入一个int值,这个值表示的就是初始的容量,如果没有传这个值,那么默认的容量是0。
通过上面的代码我们看到如果capacity是0的话,和不传int参数的作用是一样的,如果int值是大于0的那么,我们保存对象用的数组就是这个确切的值。
那么如果说我们往里存入对象时,空间不够用了,会发生什么呢?
这里我们看到了如果说size 和数组的长度一样了,也就是说数组满了,那么会重新new出一个数组,这个数组大小是s + (s < (MIN_CAPACITY_INCREMENT / 2) ? MIN_CAPACITY_INCREMENT : s >> 1)
,而这个MIN_CAPACITY_INCREMENT
常量的大小是12:
因此如果是刚开始size小于6的话,那么这个新的数组长度就会变成12,如果size已经比大于货等于12了,那么这个新的数组就是原来的两倍大小。
在addAll方法中还有另一种逻辑,但是和这个逻辑基本是一致的,有兴趣的可以去看看java源码。