ArrayList的初始长度,扩容机制?
Capacity和size概念,以区别数组的length;Capactiy存的是长度(从0开始),size是数量。
初始长度叫Capacity,如果没有指定,默认10。ArrayList的底层是由一个Object[]数组构成的, 而这个Object[]数组,默认的长度(Capacity)是10 ,直接用list.size()方法,获取的是“对象”个数,当你利用add()方法,向ArrayList内添加一个“元素”时, 逻辑长度就增加1位。 而剩下的9个空元素不被计算。 扩容机制:
可见默认的构造器,其调用了参数为10的构造函数
public ArrayList() {
s(10);
}
复制代码
这个带参数的构造函数,初始化了一个长度为初始容量的数组。
public ArrayList(int initialCapacity) {
er();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
s.elementData = new Object[initialCapacity];
}
复制代码
再看看add方法,确信当前容量是否能容下新增加的对象,先自增1,
public boolean add(E e) {
ensureCapacity(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
复制代码
此方法里,一旦发现容量不足,会自动扩充容量,新的大小是1.5倍
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
? 0: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
//o的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
//判断新的容量是不是大于最小容量和小于最大容量
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
//通过底层的复制方法将原有数据复制过来
elementData = Arrays.copyOf(elementData, newCapacity);
}
复制代码