简介
ArrayList 是集合中最常见一个实现类,ArrayList继承AbstractList抽象类,实现List接口。
ArrayList UML图
ArrayList 定义
1 | public class ArrayList<E> extends AbstractList<E> |
ArrayList简单而言就是一个动态数组,它的容量是动态增长的,默认容量是10。它继承了AbstractList,实现了List、RandomAccess、Cloneable及Serializable接口。
- RandomAccess:支持随机访问标记
- Serializable:支持序列化
ArrayList属性
1 | // 保存元素的数组 |
构造方法
1 | // 构造一个默认容量(10)的ArrayList |
方法摘要
返回类型 | 方法名称 | 描述 |
---|---|---|
boolean | add(E e) | 增加指定的元素 |
void | add(int, index, E e) | 在指定位置元素 |
boolean | addAll(Collection<? extends E> c) | 增加指定集合的所有元素 |
boolean | addAll(int index, Collection<? extends E> c) | 在指定位置开始增加集合的所有元素 |
void | clear() | 清空所有元素 |
Object | clone() | 克隆副本 |
boolean | contains(Object o) | 判断是否包含指定的元素。如存在返回true,否则返回false |
void | ensureCapacity(int minCapacity) | 如有必要增加容量,确保至少能容纳指定的(minCapacity)元素 |
void | forEach(Consumer<? super E> action) | 迭代执行每个元素的业务逻辑直至完成或抛出异常 |
E e | get(int index) | 返回指定位置的元素 |
int | indexOf(Object o) | 返回列表中首次出现指定元素的位置,不存在返回-1 |
boolean | isEmpty() | 判断集合是否为空 |
Iterator |
iterator() | 返回此集合元素的迭代器 |
ListItrator |
listIterator() | 返回列表中元素的列表迭代器(按适当的顺序)。 |
ListItrator |
listIterator(int index) | 返回从指定位置开始的列表迭代器(按适当的顺序)。 |
boolean | remove(Object o) | 删除指定的元素 |
E | remove(int index) | 删除列表指定位置的元素 |
boolean | removeAll(Collection<?> c) | 删指定集合的所有元素 |
boolean | removeIf(Predicate<? super E filter) | 删除满足条件的所有元素 |
void | removeRange(int fromIndex, int toIndex) | 删除列表中fromIndex(含)到toIndex(含)之间的所有元素 |
E | set(int index, E e) | 用指定的元素替换列表中指定位置的元素 |
int | size() 解析 | 返回集合元素大小 |
void | sort(Comparator<? super E> c) | 排序 |
List |
subList(int fromIndex, int toIndex) | |
Object[] | toArray() | |
toArray(T []) | ||
void | trimToSize() | 容量调整为当前元素大小 |
核心源码(基于1.8)
增加元素
1 | /** |
扩容过程
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
插入元素过程
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
0 | 1 | 2 | 9 | 3 | 4 | 5 |
删除元素
1 | /** |
ArrayList遍历元素
1. 通过迭代器遍历
1 | Iterator<Integer> iter = list.iterator(); |
2. 随机访问,然后通过索引值遍历
1 | for(int i=0;i<list.size();i++){ |
####3. foreach1
2
3for(Integer i : list) {
System.out.println(list.get(i));
}
总结
- ArrayList是基于动态数组实现的数据结构
- 扩容时会扩充为原容量的1.5倍
- 删除元素时不会自动缩容,但提供了trimToSize()方法缩容为实际元素大小
- 随机(下标)访问效率高
- 插入删除要移动数组,效率较低
- 非线程安全
本系列文章是为团队内部分享参考网络资料及个人理解整理而成