一、关于构造函数
1.无参构造,会直接给你一个空的名为 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的数组(在JDK6中是直接返回长度为10的数组)
根据此名字,在第一次添加元素时会将容量(capacity)增长至10。
2.有参构造,根据你传进去的 initialCapaticy(最初容量)决定,大于零返回此长度的数组,等于零返回 EMPTY_ELEMENTDATA(区别于DEFAULTCAPACITY_EMPTY_ELEMENTDATA)。
二、关于扩容机制
以使用无参构造器创建的数组为例,第一次添加元素时,size为0,minCapacity作为参数传进去的是1,在ensureCapacityInternal(确保容量内部)方法中调用了calculateCapacity,在其中会判断数组是否为最初的DEFAULTCAPACITY_EMPTY_ELEMENTDATA,是则将DEFULT_CAPACITY返回。
在第二次加入元素时,传入的minCapacity则为2(size是指元素的个数),所以,在calculateCapacity的判断不会通过。
而在ensureExplicitCapacity中 minCapacity在增加到11之前都不会触发grow函数。(minCapacity为所需最小容量也就是现拥有元素个数加一,elementData.length为容器大小。)
在添加第11个元素时,判断成立,调用grow函数。grow函数中非常简洁明了,直接将现容器大小赋值给oldCapacity,将容器增加至原来的1.5倍,此处用了右移一位(也就是除以2,但是效率比除法高,会取整,15>>1 = 7)。
在增加至1.5倍之后,会出现两种可能性:
1.还太小,则直接用最小满足容量minCapacity
2.大了(指比MAX_VALUE(MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8)大),则使用hugeCapacity让minCapacity与MAX_ARRAY_SIZE进行比较,大则返回Integer.MAX_VALUE,小则返回MAX_ARRAY_SIZE,前面的判断是看看minCapacity有没有超出int的范围(超出则会返回- 2 ^31)。