先说结论,在证明:
1.ArrayList中维护了一个Object类型的数组elementData.(ArrayList中的储存数组)
2.当创建ArrayList对象时,如果使用的是无参构造器,则初始elementDate容量为0,第一次添加,则扩容elementData到10,如果在需要扩容,则扩容elementData为1.5倍。
3.如果使用的是指定大小的构造器,则初始elementData容量为指定大小,如果需要扩容,则直接扩容elementData为1.5倍。
java
ArrayList list=new ArrayList();创建一个对象,我们看看底层会发生啥
deBug的步入
java
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
elementData是存储数组, DEFAULTCAPACITY_EMPTY_ELEMENTDATA是一个空数组赋给elementData
java
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
退出ArrayList创建对象。
java
for (int i=1;i<=10;i++){
list.add(i);循环添加到ArrayList里面
看看add方法咋运行
java
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
先有一个自动装箱的过程,将数字转换成integer类型
java
public boolean add(E e) {
modCount++;
add(e, elementData, size);
return true;
}
e是添加的元素,modCount是添加的次数,调用的ArrayList的其他add方法,传入了一个e,elementData空数组,size元素个数
步入另一个add方法
java
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
第一个判断 元素数量是否等于空数组的length,如果等于要对数组扩容,没有等于则直接进行添加
步入grow方法
java
private Object[] grow() {
return grow(size + 1);
}
继续步入里面的grow方法
java
private Object[] grow(int minCapacity) {
int oldCapacity = elementData.length;
if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
int newCapacity = ArraysSupport.newLength(oldCapacity,
minCapacity - oldCapacity, /* minimum growth */
oldCapacity >> 1 /* preferred growth */);
return elementData = Arrays.copyOf(elementData, newCapacity);
} else {
return elementData = new Object[Math.max(DEFAULT_CAPACITY, minCapacity)];
}
}
将数组elementData长度赋给oldCapacity.
oldCapacity进行判断扩容力度
如果oldCapacity大于0或者elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA说明elementData不是首次扩容,然后进行1.5倍数进行扩容。
否则给elementData 返回DEFAULT_CAPACITY为10的数。