1.什么是ArrayList?
简单来说,它就是一个基于数组实现的动态列表,每个ArrayList实例都有一个容量 。 容量是用于存储列表中的元素的数组的大小。 它总是至少与列表大小一样大。 当元素添加到ArrayList时,其容量会自动增长。
2.API学习:
1.构造方法:
ArrayList()
构造一个初始容量为10的空列表。
ArrayList(Collection<? extends E> c)
构造一个包含指定集合的元素的列表,按照它们由集合的迭代器返回的顺序。
ArrayList(int initialCapacity)
构造具有指定初始容量的空列表。
2.其他方法:
boolean add(E e)
将指定的元素追加到此列表的末尾。
void add(int index, E element)
在此列表中的指定位置插入指定的元素。
boolean addAll(Collection<? extends E> c)
按指定集合的Iterator返回的顺序将指定集合中的所有元素追加到此列表的末尾。
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到此列表中,从指定的位置开始。
void clear()
从列表中删除所有元素。
Object clone()
返回此 ArrayList实例的浅拷贝。
boolean contains(Object o)
如果此列表包含指定的元素,则返回 true 。
void ensureCapacity(int minCapacity)
如果需要,增加此 ArrayList实例的容量,以确保它可以至少保存最小容量参数指定的元素数。
void forEach(Consumer<? super E> action)
对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。
E get(int index)
返回此列表中指定位置的元素。
int indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
boolean isEmpty()
如果此列表不包含元素,则返回 true 。
Iterator<E> iterator()
以正确的顺序返回该列表中的元素的迭代器。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
ListIterator<E> listIterator()
返回列表中的列表迭代器(按适当的顺序)。
ListIterator<E> listIterator(int index)
从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
E remove(int index)
删除该列表中指定位置的元素。
boolean remove(Object o)
从列表中删除指定元素的第一个出现(如果存在)。
boolean removeAll(Collection<?> c)
从此列表中删除指定集合中包含的所有元素。
boolean removeIf(Predicate<? super E> filter)
删除满足给定谓词的此集合的所有元素。
protected void removeRange(int fromIndex, int toIndex)
从这个列表中删除所有索引在 fromIndex (含)和 toIndex之间的元素。
void replaceAll(UnaryOperator<E> operator)
将该列表的每个元素替换为将该运算符应用于该元素的结果。
boolean retainAll(Collection<?> c)
仅保留此列表中包含在指定集合中的元素。
E set(int index, E element)
用指定的元素替换此列表中指定位置的元素。
int size()
返回此列表中的元素数。
void sort(Comparator<? super E> c)
使用提供的 Comparator对此列表进行排序以比较元素。
Spliterator<E> spliterator()
在此列表中的元素上创建late-binding和故障快速 Spliterator 。
List<E> subList(int fromIndex, int toIndex)
返回此列表中指定的 fromIndex (包括)和 toIndex之间的独占视图。
Object[] toArray()
以正确的顺序(从第一个到最后一个元素)返回一个包含此列表中所有元素的数组。
<T> T[] toArray(T[] a)
以正确的顺序返回一个包含此列表中所有元素的数组(从第一个到最后一个元素); 返回的数组的运行时类型是指定数组的运行时类型。
void trimToSize()
修改这个 ArrayList实例的容量是列表的当前大小。
通过上面的学习,我们基本可以运用ArrayList来进行相关的开发了,但我们如果想要真正了解它,我们还需要知道它到底是如何被实现的。
1.首先我们通过查看ArrayList类的源码,我们可以发现下面代码:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
很显然,ArrayList类继承了AbstractList类,实现了List,RandomAccess,Cloneable,Serializable接口,所以我们下面要思考的问题是:为什么?
2.为什么ArrayList要继承AbstractList类?
我们要弄清楚这一点,就必须了解AbstractList是什么?
通过查询API我们知道:
此类提供的骨干实现的List接口以最小化来实现该接口由一个“随机访问”数据存储备份所需的工作(如阵列。简而言之,这个类是java开发者用来简化我们开发自己的List类而写的,我们如果要自己开发List类,不必从实现List接口开始写(那样浪费时间),而是可以通过继承这种类来简化操作。
下面我们来看一下此类的API就理解了:
boolean add(E e)
将指定的元素追加到此列表的末尾(可选操作)。
void add(int index, E element)
将指定的元素插入此列表中的指定位置(可选操作)。
boolean addAll(int index, Collection<? extends E> c)
将指定集合中的所有元素插入到此列表中的指定位置(可选操作)。
void clear()
从此列表中删除所有元素(可选操作)。
boolean equals(Object o)
将指定的对象与此列表进行比较以获得相等性。
abstract E get(int index)
返回此列表中指定位置的元素。
int hashCode()
返回此列表的哈希码值。
int indexOf(Object o)
返回此列表中指定元素的第一次出现的索引,如果此列表不包含元素,则返回-1。
Iterator<E> iterator()
以正确的顺序返回该列表中的元素的迭代器。
int lastIndexOf(Object o)
返回此列表中指定元素的最后一次出现的索引,如果此列表不包含元素,则返回-1。
ListIterator<E> listIterator()
返回列表中的列表迭代器(按适当的顺序)。
ListIterator<E> listIterator(int index)
从列表中的指定位置开始,返回列表中的元素(按正确顺序)的列表迭代器。
E remove(int index)
删除该列表中指定位置的元素(可选操作)。
protected void removeRange(int fromIndex, int toIndex)
从此列表中删除所有索引在 fromIndex之间的 fromIndex ,包括 toIndex ,独家。
E set(int index, E element)
用指定的元素(可选操作)替换此列表中指定位置的元素。
List<E> subList(int fromIndex, int toIndex)
返回此列表中指定的 fromIndex (含)和 toIndex之间的视图。
从上面的方法我们可以看出这个类涵盖了操作的列表的大多数方法。
下面我们来进行联想一下:是不是不止这一个集合采用此种方式来实现的?
我们看一下下面的图:
通过上图我们知道,所有的集合接口都有一个对应的骨架实现类来简化库开发人员的工作量。
2.实现List接口
显然,上面的骨架类并不能完全满足我们的需求,所以我们还是需要实现List接口的。
3.实现RandomAccess接口:
此接口的主要目的是允许通用算法更改其行为,以便在应用于随机访问列表或顺序访问列表时提供良好的性能。List实现使用的标记界面,表明它们支持快速(通常为恒定时间)随机访问。
4.实现Cloneable接口:
我们要知道在没实现Cloneable接口的实例上调用对象的克隆方法会导致异常CloneNotSupportedException. 所以为了保证我们的ArrayList对象能调用克隆方法,我们必须实现此接口。
5 .实现java.io.Serializable
没实现此接口的类将不会使任何状态序列化或反序列化,所以要实现此类保证ArrayList能正常序列化。