1、扩容机制
- 扩容是懒惰式的,既没有添加元素前,即使制定了容量,也不会真正创建数组
- add(Object o ) 首次扩容为10,再次扩容是上次容量的1.5倍
- addAll(Collection c) 首次扩容为10和十几元素的最大值
- addAll(Collection c) 再次扩容(有元素时)为元容量的1.5倍和实际元素个数的最大值
fail-fast 和 fail-safe
// fail-fast 一旦发现遍历的同时有其他线程修改,则会立即抛出异常
// fail-safe发现遍历的同时其它线程来修改,应当能有应对策略,例如牺牲一致性来遍历运行完成
- ArrayList是fail-fast的典型代表,遍历的同时不能修改,尽快报错失败
- CopyOnWriteArrayList 是 fail-safe 的典型代表,遍历的同时可以修改,原理是读写分离
2、ArrayList 和 LinkedList
* ArrayList
① 基于数组,需要连续的内存
② 随机访问块(根据下标访问元素)
③ 尾部插入、删除性能可以,其他部分插入、删除插入都会移动数据,因此性能会低
④ 可以利用CPU缓存,局部性原理
* LinkedList
① 基于双向链表,无需连续的内存
② 随机访问慢(要沿着链表遍历)
③ 头尾插入删除性能高
④ 占用内存多