ArrayList源码阅读

首先看ArrayList的签名

public class ArrayList extends AbstractList
        implements List, RandomAccess, Cloneable, java.io.Serializable

ArrayList特点:
随机访问速度快,插入和移除性能较差(数组的特点);
支持null元素;
有顺序;
元素可以重复;
线程不安全;

ArrayList主要用 Object[] elementData作为其基本数据结构。
size维护元素个数,size不一定等于elementData.length,当size大于elementData.length的时候需要对elementData进行扩容。

源码中用的最多的两个方法是Arrays.copyOf和System.arraycopy。

Arrays.copyOf源码:

    public static  T[] copyOf(U[] original, int newLength, Class newType) {
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

可以看到,Arrays.copyOf主要也用到了System.arraycopy方法,System.arraycopy是一个native方法,方法签名如下:

    public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

意思是从src的srcPos位置,复制length长度的内容到dest的destPos位置。
因为ArrayList是用数组作为其基本数据结构的,当插入、移除制定位置的元素时候都要移动数组,移动数组就用到了System.arraycopy方法。

ArrayList的subList方法要注意。它返回原来list的从[fromIndex, toIndex)之间这一部分的视图,之所以说是视图,是因为实际上,返回的list是靠原来的list支持的。所以,你对原来的list和返回的list做的“非结构性修改”(non-structural changes),都会影响到彼此对方。所谓的“非结构性修改”,是指不涉及到list的大小改变的修改。相反,结构性修改,指改变了list大小的修改。

参考:https://www.cnblogs.com/gaojing/archive/2012/06/17/java-list-sublist-caution.html

你可能感兴趣的:(ArrayList源码阅读)