ArrayList源码解析...

Ctrl + 单机 进入ArrayList , 开始探秘。。。


开撸

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

ArrayList 继承于AbstractList,实现了List接口,是一个长度可变的集合,提供了增删改查的功能。集合中允许null的存在。ArrayList类还是实现了RandomAccess接口,可以对元素进行快速访问。实现了Serializable接口,说明ArrayList可以被序列化,还有Cloneable接口,可以被复制。

    // 初始容量-默认值
    private static final int DEFAULT_CAPACITY = 10;
    //  这个变量可以在无参构造器中看到 
    private static final Object[] EMPTY_ELEMENTDATA = {};
    //可以看到,这里的elementData参数被transient 修饰,表示不会被序列   
    //化的一个,而ArrayList的本质结构也可以发现是对象数组
    private transient Object[] elementData;
    // 长度
    private int size;

无参构造器


   public ArrayList() {
        super();
        this.elementData = EMPTY_ELEMENTDATA;
    }

有参构造器

一个int类型的参数,指定生成的list的数组长度,并对其传入的参数进行了一个校验,后面抛出了异常,异常的机制可以参考本栈的责任链模式那片文章了解

 public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

集合作为参数,ArrayList的构造器

  public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

ArrayList构造的时候,采用集合作为参数,首先对传入的集合

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

推荐阅读更多精彩内容