概述
ArrayList继承于AbstractList,并实现了Serializable,Cloneable。Iterable,Collection,List,RandomAccess这些接口。
- Seriallizable ,序列化接口,支持序列化,可通过序列化传输
- Cloneable,能被克隆
- Iterable,可以被迭代器遍历
- Collection,拥有集合操作的所有方法
- 实现了List接口,拥有增删改
- 实现了RandomAccess,支持快速随机访问
特点:
- 底层是一个动态扩容的数组结构,初始容量为10,扩容时增加1.5倍容量(addAll可能有例外)
- 允许存放重复数据,存储顺序按照元素添加顺序,允许存在null
- 底层使用Arrays.copyOf函数进行扩容,扩容产生新的数组、对数组内容的深拷贝会耗费性能
- ArrayList不是一个线程安全的集合,若涉及线程安全,可使用CopyOnWriteArrayList或Collections.synchronizedList()
属性
//序列化ID
private static final long serialVersionUID = 8683452581122892189L;
//默认容量
private static final int DEFAULT_CAPACITY = 10;
//默认空数组
private static final Object[] EMPTY_ELEMENTDATA = {
};
//无参调用时使用该数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {
};
//存储ArrayList元素的数组
transient Object[] elementData; // non-private to simplify nested class access
//元素的个数
private int size;
构造方法
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) {
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;
}
}
- 第一个,指定大小的构造方法,如果传入为0,直接使用EMPTY_ELEMENTDATA,否则new一个
- 第二个,空无参构造,将默认数组赋值给他
- 第三个,参数为集合类,首先直接利用Collection.toArray()方法得到一个对象数组,并赋值给elementData。
不管调用哪个方法都会初始化内部elementData 。
add系列
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++]