ArrayList源码阅读

首先看ArrayList的签名

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, 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,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> 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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容