ArrayList知识点

1.扩容机制

 

  1.扩容是懒惰式的,即没有添加元素前,即时指定了容量,也不会真正的创建数组

  2. add(Object o) 方法首次扩容为10,再次扩容为上次的1.5倍

  3. addAll(Collection c) 方法首次扩容(没有元素)为10,或者添加的元素实际个数,取两者间的最大值

  4. addAll(Collection c) 方法再次扩容(有元素时)取原容量1.5倍或者实际元素个数,取两者间最大值.

 

 

2. fail-fast 与 fail-safe 机制

  1. fail-fast : 一旦发现遍历集合的同时,其他人来修改则立即抛出异常

  2. fail-safe : 发现遍历集合的同时其他人来修改,应当能有应对策略,例如牺牲一部分一致性,来让整个遍历运行完成

  3. ArrayList 是fail-fast的典型代表,遍历同时不能修改,底层实现是在遍历前记录了集合的修改次数,在循环过程中如果发现集合的修改次数与遍历前记录的不一致,直接抛出并发修改异常

  4. CopyOnWriteArrayList 是 fail-safe的典型代表,遍历的同时可以修改,原理是读写分离,就是在修改集合的时候,底层会创建一个新的数组,复制出之前的数据并添加修改后的数据,但是遍历时使用的还是旧的数组,所以不会报错,但是遍历时也不会读取到新添加的数据.

 

 

3. ArrayList 与 LinkedList 的比较

 

  1. ArrayList

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

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

    3. 尾部插入,删除性能可以,其他部分插入,删除都会移动数据,因此性能低

    4. 可以利用 cpu 的缓存,通过局部性原理

  2. LinkedList

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

    2. 随机访问慢 (要沿着链表遍历)

    3. 头尾插入,删除性能高,但是中间插入查找位置效率慢,所以性能低

    4. 占用内存多

原文地址:https://www.cnblogs.com/xuxiaobai13/p/15437642.html