public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable



java.util.ArrayList,动态数组,实现了Java集合中List和Clonable接口。与普通数组相比,ArrayList具有以下优点:

· 支持对各种类型数据的存储,包括自定义类型和null(在同一个ArrayList实例中可存储不同类型的数据(对象));

· 数组长度可变,每次扩容时新数组的长度变为原数组的1.5倍加1;

· 以方法的形式提供随机访问和增加、删除、修改等功能;

· 实现了Clonable接口,可直接对数组进行克隆;


构造函数

ArrayList提供了三种构造函数。

默认构造函数 ArrayList() 构造了一个空的实例,默认的数组长度为10;

含参构造函数 ArrayList(int initialCapacity) 构造了一个空的实例,以参数值作为数组长度;

拷贝构造函数 ArrayList(Collection<? extends E> c) 将参数c中存储的内容作为其数组元素,长度同c的长度。


创建ArrayList实例时可通过模板的方式指定数据类型:List<String> al = new ArrayList<>();  此时al中只能存储String类型的数据,若执行al.add(5);则报错。


常用方法

· 添加

ArrayList提供了四种添加函数。

boolean add(E e) 函数将一个任意类型的数据(对象)添加到list的末尾,添加成功后返回true;

void add(int index, E element) 函数将数据(对象)添加到数组的index位置,并把其后的元素向后平移一个位置;

boolean addAll(Collection<? extends E> c) 函数把c中的元素依次添加到list的末尾;

boolean addAll(int index, Collection<? extends E> c) 函数把c中的元素从原list的index位置开始添加,其后的元素均向后平移的位置数为c中元素的个数。


· 删除

E remove(int index) 函数删除list中index位置的元素,并把其后元素左移一个位置;

boolean remove(Object o) 函数删除list中第一次出现的元素o,如果未出现,则list无变化;

boolean removeAll(Collection<?> c  函数删除与c中包含的元素相同的元素;

boolean removeIf(Predicate<? super E> filter) 函数删除list中满足给定条件的元素;

void removeRange(int fromIndex, int toIndex) 函数删除list中从fromIndex位置(含)到toIndex位置(不含)的元素。


· 查询

E get(int index) 函数返回list中在index位置的元素;

int indexOf(Object o) 函数返回list中元素o第一次出现的位置,若未出现则返回-1;

int lastIndexOf(Object o) 函数返回list中元素o最后一次出现的位置,若未出现则返回-1;

int size() 函数返回list中元素个数;

List<E> subList(int fromIndex, int toIndex) 函数返回list中从fromIndex位置(含)到toIndex位置(不含)的元素们。


· 修改

E set(int index, E element) 函数把list中index位置的元素替换成element;

void replaceAll(UnaryOperator<E> operator) 函数把list中某个所有相同的元素全部替换成另一个元素。


性能

· 随机访问

由于ArrayList本质上是数组,其也拥有数组“随机访问”的特点。进行随机查找时,能够直接返回数组中指定位置的元素,无需从头开始遍历。时间复杂度为o(1),效率极高。

· 末尾添加/删除

先随机访问最后一个元素,然后值直接在其后添加或删除该元素。由于随机访问时间复杂度为o(1),故末尾添加/删除也为o(1)。

· 随机位置添加/删除

数组的存储是连续的,在某个位置(非末尾)添加(删除)元素必然导致其后的所有元素均向后(前)移动,这种开销会随着数组规模的增加而增加。时间复杂度o(n),效率较低。


适用场景

· 频繁需要随机访问操作

· 只需在末尾对数据进行添加或删除

· 而不是在前面或中间添加或删除数据