ArrayList源码解读

Posted catsblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ArrayList源码解读相关的知识,希望对你有一定的参考价值。

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

      列表接口的可调整数组实现。实现所有可选列表操作,并允许所有元素,包括null。除了实现List接口之外,该类还提供了一些方法来操作用于存储列表的内部数组的大小。(这个类大致相当于Vector,只是它是不同步的。size为空、get、set、iterator和listIterator操作在常量时间内运行。add操作在平摊常数时间内运行,也就是说,添加n个元素需要O(n)时间。所有其他操作都在线性时间内运行(粗略地说)。与LinkedList实现相比,常量因素要低。每个ArrayList实例都有一个容量。容量是用于存储列表中元素的数组的大小。它总是至少和列表大小一样大。当元素被添加到ArrayList中时,它的容量会自动增长。除了添加一个元素具有恒定的平摊时间代价之外,没有指定增长策略的细节。在使用ensureCapacity操作添加大量元素之前,应用程序可以增加ArrayList实例的容量。这可能会减少增量重新分配的数量。注意,这个实现不是同步的。如果多个线程同时访问一个ArrayList实例,并且至少有一个线程从结构上修改了这个列表,那么它必须在外部同步。(结构修改是添加或删除一个或多个元素,或显式调整支持数组的大小的任何操作;仅仅设置元素的值并不是结构上的修改。)这通常是通过对一些自然封装列表的对象进行同步来实现的。如果不存在这样的对象,则应该使用这个{@link Collections#synchronizedList Collections.synchronizedList} 方法“包装”列表。这最好在创建时完成,以防止意外的不同步访问列表:

List list =Collections.synchronizedList(new ArrayList(...))。<a name="fail-fast"> The iterators returned by this class‘s {@link #iterator() iterator} and

{@link #listIterator(int) listIterator} methods are <em>fail-fast</em>:</a>,如果列表在迭代器之后的任何时候被结构修改,除了通过迭代器自己的{@link ListIterator#remove()或{@link ListIterator#add(Object) add}方法创建外,该迭代器将抛出一个{@link ConcurrentModificationException}异常。因此,在面对并发修改时,迭代器会快速而干净地失败,而不是在将来某个不确定的时间冒着任意的、不确定的行为的风险。注意,不能保证迭代器的快速故障行为,因为一般来说,在存在非同步并发修改的情况下,不可能做出任何严格的保证。故障快速迭代器以最大的努力抛出{@code ConcurrentModificationException}。因此,编写一个依赖于此异常来判断其正确性的程序是错误的:迭代器的快速故障行为应该只用于检测bug.

private static final long serialVersionUID = 8683452581122892189L:串行版本uid
private static final int DEFAULT_CAPACITY = 10:默认初始容量
private static final Object[] EMPTY_ELEMENTDATA = {}:用于空实例的共享空数组实例
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}:用于默认大小的空实例的共享空数组实例。我们将其与EMPTY_ELEMENTDATA区分开来,以了解添加第一个元素时应该膨胀多少。
transient Object[] elementData:存储ArrayList元素的数组缓冲区。ArrayList的容量是这个数组缓冲区的长度。任何带有elementData==DEFAULTCAPACITY_EMPTY_ELEMENTDATA的空ArrayList当添加第一个元素时,会扩展到DEFAULT_CAPACITY(数组初始化容量)
private int size:数组元素的数量
public ArrayList(int initialCapacity):带有初始化容量的构造器
public ArrayList(Collection<? extends E> c):将集合转换成数组
protected transient int modCount = 0:ArrayList继承抽象类AbstractList中的变量,该变量被transient关键字修饰,将此变量脱离序列化,累积这个list的结构被修改的次数
public void trimToSize():将此ArrayList实例的容量修剪为列表的当前大小。应用程序可以使用此操作最小化存储ArrayList实例。
public Object clone():返回此<tt>ArrayList</tt>实例的浅拷贝。(元素本身不会被复制)
private void fastRemove(int index) :Private remove方法,该方法跳过边界检查,但不跳过返回删除的值。
public void clear():Removes all of the elements from this list.  The list will be empty after this call returns.
 

以上是关于ArrayList源码解读的主要内容,如果未能解决你的问题,请参考以下文章

源码阅读Java集合 - ArrayList深度源码解读

ArrayList源码解读(部分)

arraylist源码解读

ArrayList源码解读(jdk1.8)

ArrayList源码解读

Collections之Arraylist源码解读(六)