Arraylist源码剖析

Posted by 大雁小鱼的博客 on June 3, 2018

ArrayList源码剖析

ArrayList是List接口的可变数组实现,底层是以数组形式实现的,如果数组大小不够了,它会自动扩容。本博客对核心的函数进行分析,对一些边角的、大家容易理解的函数不做分析。

首先它的内部是一个数组,存储的是Object对象

   transient Object[] elementData; 

其次,它也会有容量不够的时候,在加入一个元素之前,它会判断容量是否够,不够了,扩容。下面的代码第一行是确保容量是足够的。size表示当前的数组中有效的元素个数。从第二行代码可以看出每次加入的元素都放在最后面。

    public boolean add(E e) {  
        ensureCapacityInternal(size + 1);  // Increments modCount!!  
        elementData[size++] = e;  
        return true;  
    }  

最后说一下扩容规则,扩容的规则就是扩原来的一半,比如原来是16,扩容就是加8,即24

    private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

最后的最后,我说一下面试时可能被问到的问题。面试官问:ArrayList能否存放null?正确的回答是:可以的。