看过很多文章,都说ArrayList初始大小为10.但是看了源码发现构造方法中并不是这么回事,令我产生了怀疑。我一直坚信计算机是门科学,是有科学依据的。下面是我对ArrayList的源码收获。
首先看下两个初始化构造方法
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
其中无参构造方法复制常量 DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是个Object[]数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
这是我产生了疑问,为什么这么设计,初始化是个空呢?不是都说初始默认为10嘛?
我坚信java大牛们这么做一定都道理,带着疑问继续查看源码发现,在add方法中做了如下操作
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
看出奥秘了,原来初始化中并没有设置10,而是在add方法时动态判断应该对出多大空间。如果为初始化,如果为add单一元素,则就是使用默认初始值10,如果是添加多个,就与初始值10进行比较,哪个大是哪个。真是把空间利用到极致了。
学习源码,乐趣无穷。