public class ArrayList<E> {
//默认容量
private static final int DEFAULT_CAPACITY = 10;
//初始化数组
private static final Object[] EMPTY_ELEMENTDATA = {};
//初始化存储数组
transient Object[] elementData;
//包含的元素个数
private int size;
//无参构造 空集合
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
//有参构造 根据参数初始化大小
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 void trimToSize() {
modCount++;
//如果集合的大小小于它存储实体数组的长度,就按照集合的大小截取数组非空部分。
//类似于字符串的去空格
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
//增加元素
public boolean add(E e) {
//需要的最小容量为当前元素个数+1,调用确认内部容量方法。
ensureCapacityInternal(size + 1);
elementData[size++] = e;
return true;
}
//内部确认需要的容量private
private void ensureCapacityInternal(int minCapacity) {
//如果当前数组还没有元素存在,就用默认大小来初始化数组
if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
}
ensureExplicitCapacity(minCapacity);
}
//确认具体容量数值
private void ensureExplicitCapacity(int minCapacity) {
modCount++;
// overflow-conscious code
//内存溢出考量代码
//如果最小需要的size大于数组当前长度的话,就继续grow
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
private void grow(int minCapacity) {
// overflow-conscious code
//数组的旧长度
int oldCapacity = elementData.length;
//新长度为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);
}
//
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0) // overflow
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE ://list最大容量依然是Integer.MAX_VALUE
MAX_ARRAY_SIZE;
}
}
ArrayList源码学习(1.1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.