ArrayList的本质是一个 对数组进行了封装的类

在进行ArrayList 对象的初始化时,默认创建一个长度为10的数组(或传入的数值)

ArrayList的构造器:

    public ArrayList(int initialCapacity) {
	//传入存储大小的初始化
        if (initialCapacity > 0) {
            this.elementData = new Object[initialCapacity];
        } else if (initialCapacity == 0) {
            this.elementData = EMPTY_ELEMENTDATA;
        } else {
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        }
    }
    public ArrayList() {
	// 默认初始化
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    public ArrayList(Collection<? extends E> c) {
	// 接收一个Collection 接口的实现类,转化为ArrayList 
        Object[] a = c.toArray();
        if ((size = a.length) != 0) {
            if (c.getClass() == ArrayList.class) {
                elementData = a;
            } else {
                elementData = Arrays.copyOf(a, size, Object[].class);
            }
        } else {
            // replace with empty array.
            elementData = EMPTY_ELEMENTDATA;
        }
    }

通过Add方法向实例中添加元素,size 属性用来记录当前List的 长度,当传入新的要被添加的元素时,

ArrayList 使用内部重载的add方法 ,接收 新的元素,数组,和数组长度。再判断当前对象是否需要扩容

private void add(E e, Object[] elementData, int s) {
        if (s == elementData.length)
            elementData = grow();
        elementData[s] = e;
        size = s + 1;
    }

当判断当前对象的存储大小不满足于存储对象的大小时,创建增加原来长度1/2的新数组,并将原数组中的元素移入新的数组中。