集合框架 -- ArrayList
[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++只进行了拷贝
