众所周知数组是一个有效的数据存储集合,但是对于数组的构建需要实现对数组元素的个数进行相应的估计,因此需要一个能够动态创建储存数据的动态数组,ArrayList就是一个可以动态创建数组的一个方法容器。
二、ArrayList的逐句讲解public class ArrayListextends AbstractList implements List , RandomAccess, Cloneable, java.io.Serializable{ }
首先我们通过第一申明语句得到Array List是继承于AbstractList这个抽象列表的。它连接了 RandomAccess、Cloneable和 java.io.Serializable的接口类型。
private static final long serialVersionUID = 8683452581122892189L;
这是定义串行版本的UID的语句,这是接口的唯一标志符。
private static final int DEFAULT_CAPACITY = 10;
这是定义Java默认的ArrayList的长度。当用户创建ArrayList时,未声明ArrayList长度,则系统的默认长度为10。
private static final Object[] EMPTY_ELEMENTDATA = {};
用于空实例的共享空数组实例,简单来说就是实例化空的ArrayList数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
用于默认大小的空实例的共享空数组实例。我们将其与 EMPTY_ELEMENTDATA 区分开来,以了解添加第一个元素时要膨胀多少。
transient Object[] elementData;
ArrayList 的元素存储在其中的数组缓冲区。 ArrayList 的容量就是这个数组缓冲区的长度。添加第一个元素时,任何带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的空 ArrayList 都将扩展为 DEFAULT_CAPACITY。
private int size;
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);
}
}
构造一个具有指定初始容量的空列表,这个初始化容量为10.
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
构造一个初始容量为 10 的空列表。其中DEFAULTCAPACITY_EMPTY_ELEMENTDATA的默认值为10。
public ArrayList(Collection extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表。
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
将此ArrayList 实例的容量修剪为列表的当前大小。应用程序可以使用此操作来最小化ArrayList实例的存储空间。
public void ensureCapacity(int minCapacity) {
int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)? 0: DEFAULT_CAPACITY;
if (minCapacity > minExpand) {
ensureExplicitCapacity(minCapacity);
}
}
增加此ArrayList实例的容量,以确保它至少可以容纳由最小容量参数指定的元素数量。
private static int calculateCapacity(Object[] elementData, int minCapacity) {
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
return Math.max(DEFAULT_CAPACITY, minCapacity);
}
return minCapacity;
}
计算ArrayLIst占用空间的容量。
private void ensureCapacityInternal(int minCapacity) {
ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
}
确保ArrayList拥有足够的剩余空间
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
确保ArrayLis拥有足够的显式容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
要分配的数组的最大大小。一些在虚拟机中ArrayList保留一些关键字。尝试分配更大的数组可能会导致 OutOfMemoryError:请求的数组大小超出Java虚拟机限制
private void grow(int minCapacity) {
int oldCapacity = elementData.length;
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);
}
增加容量以确保它至少可以容纳由最小容量参数指定的元素数量。
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
判断ArrayList是否超过最大限制,超过了就抛出OutOfMemoryError异常,否则就创建数组。



