Java 集合类型之ArrayList 源码解析

层次结构

顶层层次结构

  ArrayList实际上是继承了AbstractList,同事实现了List,RandomAccess,Clonable,Serializable序列化接口。

AbstractList

  AbstractList抽象类继承了AbstractCollection并实现了List接口,其中AbstractCollection实现了Collection接口。

ArrayList源码分析

属性

1 private static final int DEFAULT_CAPACITY = 10; //默认容量
 private static final Object[] EMPTY_ELEMENTDATA = {}; //共享空数组实例为空的实例们使用。
//为默认的空实例准备的共享的空数组实例。我们区别于EMPTY_ELEMENTDATA以辨别膨胀多少当第一个元素被添加的时候。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
//这个数组缓冲区进入数组的元素被存储。
//数组的容积是数组缓冲区的长度。
//任何空的数组带数组元素等于DEFAULTCAPACITY_EMPTY_ELEMENTDATA会被展开到DEFAULT_CAPACITY当数组当中第一个元素被添加进去。
transient Object[] elementData;//非私有被简化嵌套类的访问
private int size;//数组的大小(有多少元素它包含)

方法

//构造一个空的ArrayList带10的初始化长度。
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
/*
  构造一个list包含集合选择的一些元素,在这个队列当中,它们被集合的迭代器返回。  
param c 这个集合谁的元素被放入list当中
throws NullPointerException 如果指定的集合为空
*/
    public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        if ((size = elementData.length) != 0) {
            // c.toArray(错误的)不返回数组对象。
            // (see e.g. https://bugs.openjdk.java.net/browse/JDK-6260652)
            if (elementData.getClass() != Object[].class)
                elementData = Arrays.copyOf(elementData, size, Object[].class);
        } else {
            //被替代为空数组
            this.elementData = EMPTY_ELEMENTDATA;
        }
    }
原文地址:https://www.cnblogs.com/kmsfan/p/12698028.html