其他 源码解析 https://blog.csdn.net/qq_32726809/article/category/8035214
类的声明
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- AbstractList 继承的抽象类,可以参考博文 14AbstractList
- List 实现了list接口,但是AbstractList已经实现了
- RandomAccess 实现这个接口,表明支持快速随机存取
- Cloneable 克隆
- Serializable 序列化
2属性
2.1 DEFAULT_CAPACITY
private static final int DEFAULT_CAPACITY = 10;
默认初始容量
2.2 EMPTY_ELEMENTDATA
private static final Object[] EMPTY_ELEMENTDATA = {};
用于空实例的空数组
2.3 DEFAULTCAPACITY_EMPTY_ELEMENTDATA
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
- 默认大小的空数组实例
- 之索引和 DEFAULT_CAPACITY分开,是因为加入第一个元素的时候,程序膨胀了多少。
2.4 elementData
transient Object[] elementData;
- 数组缓冲区
- 当第一个元素被添加时,所有 带有 elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA 的都会被扩展到 DEFAULT_CAPACITY默认长度
3构造函数
3.1 ArrayList(int initialCapacity)
构造函数
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);
}
}
- 可以看出如果初始容量为null,则设置elementData缓存为EMPTY_ELEMENTDATA数组,如果有容量,则分配 initialCapacity大小的空间
3.2 ArrayList()
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
- 分配默认空间
3.3 ArrayList(Collection<? extends E> c)
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
按照集合的迭代器返回的顺序,构造一个包含指定集合元素的列表。
trimToSize()
- 出去没用的空间,压缩空间
public void trimToSize() {
modCount++;
if (size < elementData.length) {
elementData = (size == 0)
? EMPTY_ELEMENTDATA
: Arrays.copyOf(elementData, size);
}
}
- 类似于 AbstractStringBuilder 中的 trimToSize()