ArrayList
扩容机制
ArrayList()
会使用长度为0的数组
ArrayList(int initialCapacity)
会使用指定容量的数组
public ArrayList(Collection<? extends E> c)
会使用c的大小作为数组容量
add(Object o)
首次扩容为10,再次扩容为上次的1.5倍
addAll(Collection c)
没有元素时,扩容为Math.max(10,实际元素个数)
,有元素时为Math.max(原容量1.5倍,实际元素个数)
扩容是懒惰式的,即没有添加元素前,即使指定了容量,也不会真正创建数组
add(Object o)首次扩容为10,再次扩容为上次容量的1.5倍
addAll(Collection c)
首次扩容为Math.max(10,实际元素个数)
addAll(Collection c)
再次扩容(有元素时)为Math.max(原容量1.5倍,实际元素个数)
fail-fast
与fail-safe
ArrayList
是fail-fast的典型代表,遍历的同时不能修改,尽快失败
CopyOnWriteArrayList
是fail-safe的典型代表,遍历的同时可以修改,原理是读写分离
ArrayList
与LinkList
比较
ArrayList
- 基于数组,需要连续储存
- 随机访问快(指根据下标访问)
- 尾部插入、删除性能可以,其他部分插入、删除都会移动数据,因此性能会降低
- 可以利用cpu缓存,局部性原理
LinkedList
- 基于双向链表,无需连续内存
- 随机访问慢(要沿着链表遍历)
- 头尾插入删除性能高
- 占用内存多