ArrayList在ava开发中经常用到。也是面试的常客。那么它的默认大小、扩容因子是多少呢?
网上有人说,arrayList的初始默认大小是10。结合源代码可以知道,我认为声明一个ArrayList后默认值是0,然后会做一个扩容使其长度达到10;(扩容调用的是add方法,具体在哪里用的还没找到)。
下面是源代码:
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
那么他的扩容因子是多少呢?网上说是0.75;查看源代码后,我认为也不够正确。正确的是应该是原长度除以2 并向下取整,并且每添加一个元素都要计算它的长度并决定是否扩容。
源代码:
添加元素:
private void add(E e, Object[] elementData, int s) {
if (s == elementData.length)
elementData = grow();
elementData[s] = e;
size = s + 1;
}
扩容函数:
private Object[] grow(int minCapacity) {
return elementData = Arrays.copyOf(elementData,newCapacity(minCapacity));
}
private int newCapacity(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity <= 0) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
return Math.max(DEFAULT_CAPACITY, minCapacity);
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return minCapacity;
}
return (newCapacity - MAX_ARRAY_SIZE <= 0) ?
newCapacity : hugeCapacity(minCapacity);
}
以上只是我自己的看法,如有不对的地方请指正