ArrayList源码解读

    一、ArrayList概述
    1.1 ArrayList简介
    1.2 ArrayList数据结构

    二、ArrayList源码分析
    2.1 ArrayList继承结构和层次关系
    2.2 类的属性
    2.3 构造方法
    2.4 主要方法
    2.4.1 get()方法
    2.4.2 set()方法
    2.4.3 add()方法
    2.4.4 remove()方法
    2.4.5 indexOf()和lastIndexOf()方法
    2.4.6 clear()方法

    三、总结
    ————————————————

    1.1 ArrayList简介

    List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。除了实现List接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于Vector类,除了此类是不同步的。)

    size、isEmpty、get、set、iterator和listIterator操作都以固定时间运行。add操作以分摊的固定时间运行,也就是说,添加n个元素需要O(n)时间。其他所有操作都以线性时间运行(大体上讲)。与用于LinkedList实现的常数因子相比,此实现的常数因子较低。
    每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。
    注意,此实现不是同步的。

    如果多个线程同时访问一个ArrayList实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。
    顶部的注释给我们透露了几点重要信息:ArrayList是List接口的大小可变数组的实现;ArrayList允许null元素;ArrayList的容量可以自动增长;ArrayList不是同步的;ArrayList的iterator和listIterator方法返回的迭代器是fail-fast的


    1.2 ArrayList数据结构

    image.png

    容量:CAPACITY ; 实际大小:size;
    ArrayList底层的数据结构就是数组,数组元素类型为Object类型,即可以存放所有类型数据。我们对ArrayList类的实例的所有的操作底层都是基于数组的。


    2.1 ArrayList继承结构和层次关系
    image.png

    image.png

    ArrayList:说明ArrayList支持泛型。extends AbstractList :继承了AbstractList。为什么要先继承AbstractList,而让AbstractList先实现List?而不是让ArrayList直接实现List?

    这里是有一个思想,接口中全都是抽象的方法,而抽象类中可以有抽象方法,还可以有具体的实现方法,正是利用了这一点,让AbstractList是实现接口中一些通用的方法,而具体的类, 如ArrayList就继承这个AbstractList类,拿到一些通用的方法,然后自己在实现一些自己特有的方法,这样一来,让代码更简洁,就继承结构最底层的类中通用的方法都抽取出来,先一起实现了,减少重复代码。所以一般看到一个类上面还有一个抽象类,应该就是这个作用。

    实现了List接口:ArrayList的父类AbstractList也实现了List接口,那为什么子类ArrayList还是去实现一遍呢?collection 的作者Josh说他写这代码的时候觉得这个会有用处,但是其实并没什么用,但因为没什么影响,就一直留到了现在。

    实现了RandomAccess接口:表明ArrayList支持快速(通常是固定时间)随机访问。在ArrayList中,我们可以通过元素的序号快速获取元素对象,这就是快速随机访问。

    实现了Cloneable接口:实现了该接口,就可以使用Object.Clone()方法了。
    implements java.io.Serializable:表明该类具有序列化功能,该类可以被序列化,什么是序列化?简单的说,就是能够从类变成字节流传输,然后还能从字节流变成原来的类。


    https://blog.csdn.net/u010250240/article/details/89762912
    https://www.cnblogs.com/zhangyinhua/p/7687377.html#_label2