JAVA8 ArrayList源码学习总结

一、ArrayList内部有3个构造方法,分别是:

1. ArrayList(),创建一个大小为10的空数组。
2. ArrayList(int initialCapacity),创建一个容量=initialCapacity的数组。
3. ArrayList(Collection c),创建一个包含所给集合的元素的数组。

二、当调用add()或addAll(Collection c)时,会先检查数组容量,不够的话会进行扩容,扩容一般扩大到原来的1.5倍,最大扩大到Integer.MAX_VALUE。代码如下:

private void grow(int minCapacity) {
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1); // 这里newCapacity为原来的1.5倍
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity); // hugeCapacity方法的实现是:newCapacity最大值为Integer.MAX_VALUE
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

三、内部有2个toArray()方法,分别是:

public Object[] toArray(),返回一个object数组。
public  T[] toArray(T[] a),返回一个特定类型的数组,使用时需手动创建一个新数组作为参数传进去。

四、ArrayList有个的modCount成员变量,当调用add、addAll、remove、removeAll等方法修改数组时,会执行modCount++。modCount主要用于在使用迭代器遍历数组时检查数组大小是否被修改,如果被修改了,就抛出ConcurrentModificationException。以下是检查的代码:

if (modCount != expectedModCount) {  // expectedModCount是创建迭代器时的modCount,括号中的modCount是最新的modCount。
                throw new ConcurrentModificationException();
            }

五、内部有3个迭代器类,分别是Itr,ListItr,ArrayListSpliterator。

Itr可以从前向后单向遍历,在某个位置删除元素。
ListItr可以双向遍历,在某个位置删除增加元素。
ArrayListSpliterator是JAVA8新增的并行迭代器,内部使用index(开始下标)、fence(结束下标)控制遍历的数组范围,可以通过trySplit方法分割出另一个ArrayListSpliterator,从而把数组分成两半,可以交给多个线程并行处理。

你可能感兴趣的:(JAVA8 ArrayList源码学习总结)