1. ArrayList的扩容机制

  1. Arraylist()会使用长度为零的数组(无参构造)
  2. Arraylist(int inittiaCapacity)会使用指定容量的数组(有参构造)
  3. public Arraylist(Collection<?extends E>c)会使用c的大小作为数组容量
  4. add(Object)首次扩容为10 ,再次扩容是上次扩容的1.5倍
  5. addAll(Collection c)没有元素时,扩容为Math.max(10,实际元素个数),有元素时

    Math.max(原容量的1.5倍,实际元素个数)

2. fail-fast fail-safe 分别是什么?

fail-fast : 一旦发现遍历的同时其他人来修改,则立刻抛出异常(ArrayList)
fail-safe:发现遍历的同时其他人来修改,应当能有应对的策略,例如牺牲一致性来让整 个遍历运行完成 (CopyOnWriteArraylist)
image.png

3. fail-fast底层原理

  1. 遍历开始之前对修改了集合的修改次数(集合长度)做一个标记

image.png

  1. 使用next()方法时,每一步发生之前都会去检查里面的元素与刚开始的值是否相同

image.png

  1. check方法:修改次数是否和之前的相同

image.png

4. fail-safe底层原理

image.png

image.png

5. ArrayList跟LinkedList的底层区别

image.png

  1. ArrayList 基于数组,需要连续的内存

    LinkedList基于双向链表,无需连续内存

  2. ArrayList 随机访问快(根据下标访问)

image.png实现了RandomAccess接口
LinkedList随机访问能力比较慢(要沿着链表遍历)
image.png

  1. 如上:
  2. ArrayList可以利用CPU缓冲,局部性原理

    LinkedList占用的内存比较多,不适合使用CPU缓冲
    image.png