注意:本文基于JDK1.8进行记录。
1 简介
最常用的集合,允许任何符合规则的元素插入,包括null和重复元素。
底层是数组结构,提供了索引机制,查找效率高,增删效率低。
线程不安全。
2 扩容机制
数组结构会有容量的概念,ArrayList的初始容量默认为10,负载因子是1,表示当插入元素后个数超出原有长度时会进行扩增,扩容增量是0.5,所以扩增后容量为1.5倍,可使用方法手动扩容和缩减。
最好指定初始容量值,避免过多的进行扩容操作而浪费时间和效率。
3 方法说明
3.1 构造方法
// 空参构造器,返回默认容量为10的集合。
public ArrayList();
// 指定长度的构造器,如果长度为0,则返回容量为0的集合。
public ArrayList(int initialCapacity);
// 传入了一个集合的构造器,如果集合长度为0,返回容量为0的集合。
public ArrayList(Collection<? extends E> c);
3.2 常用方法
// 获取个数。
public int size();
// 判断是否为空。
public boolean isEmpty();
// 判断是否包含指定数据。
public boolean contains(Object o);
// 计算指定数据首次出现的下标。
public int indexOf(Object o);
// 计算指定数据最后出现的下标。
public int lastIndexOf(Object o);
// 获取指定下标的元素。
public E get(int index);
// 设置指定下标的指定元素,并返回旧元素。
public E set(int index, E element);
// 添加指定元素,并返回是否成功。
public boolean add(E e);
// 在指定位置添加指定元素。
public void add(int index, E element);
// 删除指定位置的元素,并返回删除的元素。
public E remove(int index);
// 删除指定元素,并返回是否成功。
public boolean remove(Object o);
4 源码分析
4.1 属性
// 默认的初始容量为10。
private static final int DEFAULT_CAPACITY = 10;
// 空数组。
private static final Object[] EMPTY_ELEMENTDATA = {};
// 默认容量的空数组。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 数组。
transient Object[] elementData;
// 元素个数。
private int size;
4.2 构造方法
// 空参构造器,返回默认容量为10的集合。
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// 指定长度的构造器,如果长度为0,则返回容量为0的集合。
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);
}
}
// 传入了一个集合的构造器,如果集合长度为0,返回容量为0的集合。
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// Object[]数组里的类型不一定都是Object类型的,有可能是Object的子类,所以要判断一下。
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
this.elementData = EMPTY_ELEMENTDATA;
}
}
4.3 常用方法
// 获取个数。
public int size() {
return size;
}
// 判断是否为空。
public boolean isEmpty() {
return size == 0;
}
// 判断是否包含指定数据。
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
// 计算指定数据首次出现的下标。
public int indexOf(Object o) {