1. ArrayList的扩容机制
- Arraylist()会使用长度为零的数组(无参构造)
- Arraylist(int inittiaCapacity)会使用指定容量的数组(有参构造)
- public Arraylist(Collection<?extends E>c)会使用c的大小作为数组容量
- add(Object)首次扩容为10 ,再次扩容是上次扩容的1.5倍
addAll(Collection c)没有元素时,扩容为Math.max(10,实际元素个数),有元素时
Math.max(原容量的1.5倍,实际元素个数)
2. fail-fast fail-safe 分别是什么?
fail-fast : 一旦发现遍历的同时其他人来修改,则立刻抛出异常(ArrayList)
fail-safe:发现遍历的同时其他人来修改,应当能有应对的策略,例如牺牲一致性来让整 个遍历运行完成 (CopyOnWriteArraylist)
3. fail-fast底层原理
- 遍历开始之前对修改了集合的修改次数(集合长度)做一个标记
- 使用next()方法时,每一步发生之前都会去检查里面的元素与刚开始的值是否相同
- check方法:修改次数是否和之前的相同
4. fail-safe底层原理
5. ArrayList跟LinkedList的底层区别
ArrayList 基于数组,需要连续的内存
LinkedList基于双向链表,无需连续内存
ArrayList 随机访问快(根据下标访问)
实现了RandomAccess接口
LinkedList随机访问能力比较慢(要沿着链表遍历)
- 如上:
ArrayList可以利用CPU缓冲,局部性原理
LinkedList占用的内存比较多,不适合使用CPU缓冲