[TOC]

ArrayList

底层封装了一个Object[],长度可变,如果未指定长度默认为10,当新增的元素没有空间存放的时候,扩容为原本的1.5倍,线程不安全;

构造方法

ArrayList(int initialCapacity);
ArrayList(); 
ArrayList(Collection<? extends E> c);

三种方式进行初始化,第二种一开始是创建的空数组在添加元素的时候才会初始化为长度10

扩容

两种扩容方法,上面构造方法中说了一种,第二种在add方法中,判断数组长度不足调用grow方法进行扩容,在newCapacity方法中,会将数组长度扩展1.5倍,然后将老数组复制过来

线程安全

从源码上可以看到增减操作都没有做任何安全性限制

那么如何实现线程安全呢:

  • 通过synchronized关键字
  • 创建ArrayList对象的时候采用Collections类中的静态方法synchronizedList(new ArrayList<>()),推荐使用这个
  • 还有一个叫Vector线程安全类,不过已经不怎么使用了,11里面已经找不到了

ConcurrentModificationException异常

ArrayList不能在迭代的过程中进行修改,不然会报ConcurrentModificationException,原因是ArrayList的修改方法中都会对modCount+1,在构建迭代器的时候将modCount传给了迭代器,next方法中进行检查modCount发生变化就会抛出异常

Arrays.copy()和System.copy()

前者会创建一个新的数组,后者调用了c++只进行了拷贝