ArrayList基于数组实现,随机访问速度快,增删操作速度慢。主要是因为ArrayList的增删基于数组拷贝,通过System.arraycopy实现。
ArrayList是非线程安全的,并发修改时存在线程安全问题,并且在迭代器调用过程中如果发生并发修改,迭代器会快速失败抛出ConcurrentModificationException。
1.ArrayList提供了一系列容量确定和扩容的方法,这些方法在add()、addall()方法中被调用;
2.rangCheck方法在指定index的方法中被调用,会抛出IndexOutOfBoundsException;
3.所有修改类的方法会调用modCount++,迭代器监控到modCount的改变则抛出ConcurrentModificationException;
4.所有数组拷贝通过System.arraycopy进行;
5.所有remove类方法回将数组中多余引用设置为null,以便GC回收;
6.所有增删方法都会更新size属性;
迭代器:
1.ListIterator支持向前迭代;
2.迭代器add操作后不能直接进行set或remove操作,add操作将返回值索引设置为-1,而set和remove操作都是基于返回值索引的操作;
SubList:
通过ArrayList.subList()方法获得的SubList对象是ArrayList的一个内部类,其实质是原ArrayList的一个视图,所有对SubList的增删改操作均会影响原ArrayList;