一、扩容机制
1. ArrayList() 会使用长度为零的数组
2. ArrayList(int initialCapacity) 会使用指定容量的数组
3. public ArrayList(Collection<? extends E>c) 会使用c 的大小作为数组容量
4.add(Object o)首次扩容为10,再次扩容为上次容量的1.5倍
5.addAll(Collection c) 没有元素时,扩容为Math,max(10,实际元素个数),有元素时为Math.ma(原容量的1.5倍,实际元素个数
二、fail-fast 与 fail-safe
ArrayList是fail-fast的典型代表,遍历的同时不能修改,尽快失败
CopyOnWriteArrayList 是 fail-safe 的典型代表,遍历的同时可以修改,原理是读写分离
三、ArrayList 与 LinkedList 比较
1、ArrayList
① 基于数组,需要连续内存
② 随机访问快(指根据下标访问)
③ 尾部插入、删除性能可以,其它部分插入和删除都会移动数据,因此性能会低
④ 可以利用cpu 缓存,局部性原理
2、LinkedList
① 基于双向链表,无需连续内存
② 随机访问慢(要沿着链表遍历)
③ 头尾插入删除性能高
④ 占用内存多