ArrayList解析

作者: 风风风筝 | 来源:发表于2016-07-29 22:29 被阅读362次

    基于JDK1.8
    只列出关键方法,主要关注默认情况、初始化、扩容、add、remove。

    private static final int DEFAULT_CAPACITY = 10;
    private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
    public ArrayList() { //默认是个空数组,也有重载方法可以设置初始数组大小
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
    }
    public boolean add(E e) {
        ensureCapacityInternal(size + 1); //关注这个方法
        elementData[size++] = e;
        return true;
    }
    private void ensureCapacityInternal(int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); //默认就是10
        }
        ensureExplicitCapacity(minCapacity);
    }
    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;
        if (minCapacity - elementData.length > 0) //超过数据长度
            grow(minCapacity);
    }
    private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); //按1.5倍扩容
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
    

    get(int index)比较简单,直接返回elementData[index]。
    ArrayList比较简单,默认情况下是空数据,第一次add默认初始化长度10,每次按1.5倍扩容。再看下remove

    public E remove(int index) {
        rangeCheck(index);
        modCount++;
        E oldValue = elementData(index);
        int numMoved = size - index - 1; //判断是不是最后一项,如果不是最后一项,就把该index后面的数据项都赋值给前一位,然后再把最后一项设为null
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; //这行代码值得很多人学习,数组集合里没用的项要及时释放
        return oldValue;
    }
    

    附图


    相关文章

      网友评论

        本文标题:ArrayList解析

        本文链接:https://www.haomeiwen.com/subject/aunajttx.html