ArrayList源码学习(1.1)

来源:互联网 发布:口腔医学网络教育 编辑:程序博客网 时间:2024/06/05 11:45
public class ArrayList<E> {    //默认容量    private static final int DEFAULT_CAPACITY = 10;    //初始化数组    private static final Object[] EMPTY_ELEMENTDATA = {};    //初始化存储数组    transient Object[] elementData;    //包含的元素个数    private int size;    //无参构造 空集合    public ArrayList() {        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;    }    //有参构造 根据参数初始化大小        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 void trimToSize() {        modCount++;        //如果集合的大小小于它存储实体数组的长度,就按照集合的大小截取数组非空部分。        //类似于字符串的去空格        if (size < elementData.length) {            elementData = (size == 0)              ? EMPTY_ELEMENTDATA              : Arrays.copyOf(elementData, size);        }    }    //增加元素     public boolean add(E e) {        //需要的最小容量为当前元素个数+1,调用确认内部容量方法。        ensureCapacityInternal(size + 1);         elementData[size++] = e;        return true;    }    //内部确认需要的容量private     private void ensureCapacityInternal(int minCapacity) {         //如果当前数组还没有元素存在,就用默认大小来初始化数组        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);        }        ensureExplicitCapacity(minCapacity);    }    //确认具体容量数值    private void ensureExplicitCapacity(int minCapacity) {        modCount++;        // overflow-conscious code        //内存溢出考量代码        //如果最小需要的size大于数组当前长度的话,就继续grow        if (minCapacity - elementData.length > 0)            grow(minCapacity);    }    private void grow(int minCapacity) {        // overflow-conscious code        //数组的旧长度        int oldCapacity = elementData.length;        //新长度为1.5倍旧长度        int newCapacity = oldCapacity + (oldCapacity >> 1);        if (newCapacity - minCapacity < 0)            newCapacity = minCapacity;        if (newCapacity - MAX_ARRAY_SIZE > 0)            newCapacity = hugeCapacity(minCapacity);        //按照需要创建新数组        elementData = Arrays.copyOf(elementData, newCapacity);    }    //     private static int hugeCapacity(int minCapacity) {        if (minCapacity < 0) // overflow            throw new OutOfMemoryError();        return (minCapacity > MAX_ARRAY_SIZE) ?            Integer.MAX_VALUE ://list最大容量依然是Integer.MAX_VALUE             MAX_ARRAY_SIZE;     }}