public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
private static final long serialVersionUID = 8683452581122892189L;
/**
* Default initial capacity.
*/
private static final int DEFAULT_CAPACITY = 10;
/**
*用于空实例的共享空数组实例
*/
private static final Object[] EMPTY_ELEMENTDATA = {};
/**
* 用于默认大小的空实例的共享空数组实例。我们将其与EMPTY_ELEMENTDATA区分开来,以了解当
* 添加第一个元素。
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* 存储ArrayList元素的数组缓冲区。ArrayList的容量是此数组缓冲区的长度。添加第一个元素时,
*elementData==DEFAULTCAPACITY_empty_elementData的任何空ArrayList都将扩展为
*DEFAULT_CAPACITY。
*/
transient Object[] elementData; // non-private to simplify nested class access
首先,ArraryList的底层是数组实现的,定义了三个数组,分别是EMPTY_ELEMENTDATA 、DEFAULTCAPACITY_EMPTY_ELEMENTDATA、elementData。下面分别说说这几个数组的意思:数组为EMPTY_ELEMENTDATA就走基于用户设置大小值进行1.5倍扩容(这里是空所以是0),数组为默认空DEFAULTCAPACITY_EMPTY_ELEMENTDATA就会走基于默认值的大小10扩容进行1.5倍扩容。
具体分析:
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);
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
Object[] a = c.toArray();
if ((size = a.length) != 0) {
if (c.getClass() == ArrayList.class) {
elementData = a;
} else {
elementData = Arrays.copyOf(a, size, Object[].class);
}
} else {
// replace with empty array.
elementData = EMPTY_ELEMENTDATA;
}
}
1、如果你使用new ArraryList(30),就使用上面代码的第一个构造方法,这个时候如果你给容量大小是0,直接就会获取EMPTY_ELEMENTDATA,如果容量大于0,new Object[initialCapacity];
通过new ArraryList(0),定义了一个空数组,当需要添加元素的时候,首先判断数组的长度和当前ArarryList的size,如果相同就需要扩容,
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);
}
会判断是否是DEFAULTCAPACITY_EMPTY_ELEMENTDATA,如果是就需要根据系统默认的进行扩容,如果不是会创建一个新的数组,将原有数组复制到新数组当中去。
2、通过new ArraryList(),定义了一个空数组,此时就是用到了DEFAULTCAPACITY_EMPTY_ELEMENTDATA,具体的扩容就是按照默认大小进行扩容