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),效率较低。
适用场景
· 频繁需要随机访问操作
· 只需在末尾对数据进行添加或删除
· 而不是在前面或中间添加或删除数据