一、ArrayList的集合特点

 

问题 结      论
ArrayList是否允许空 允许
ArrayList是否允许重复数据 允许
ArrayList是否有序 有序
ArrayList是否线程安全 非线程安全
 

二、ArrayList的原理

  ArrayList底层是一个Object[] elementData数组,能够实现动态扩容,增减。

  从源码看ArrayList实现了RandomAccess, Cloneable,Serializable接口,RandomAccess用于快速存取提高循环的效率。Cloneable该接口可以实现对象的克隆方法。Serializable可以进行序列化,序列化是将对象的状态信息转换为可以存储或传输的形式的过程。

三、源码解析

1.属性和构造方法

  源码解析主要是从集合从增加元素,删除元素,查询元素,以及修改元素这几个常用方法进行解析。

  • ArrayList属性
1 transient Object[] elementData;//定义一个elementData数组2 private int size;//size是数组大小实现数组增减size进行增减
  • ArrayList无参构造方法
复制代码
1     /**2      * Constructs an empty list with an initial capacity of ten. 3      */4     public ArrayList() { 5         this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//将elementData进行初始化elementData也是个Object[]类型。空的Object[]会给默认大小106     } 7     private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
复制代码
  • ArrayList有参构造方法
复制代码
 1   public ArrayList(int initialCapacity) {  2         if (initialCapacity > 0) {  3             this.elementData = new Object[initialCapacity];//将自定义的容量大小当成初始化elementData的大小 4         } else if (initialCapacity == 0) {  5             this.elementData = EMPTY_ELEMENTDATA;//为0直接进行初始化 6         } else {  7             throw new IllegalArgumentException("Illegal Capacity: "+ 8                                                initialCapacity);//判断如果自定义大小的容量小于0,则报下面这个非法数据异常 9         } 10     }
复制代码
  • ArrayList(Collection<? extends E> c)构造方法