List
目标:
- 掌握ArrayList的扩容机制
- 掌握Iterator的fail-fast、fail-safe机制
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、ArrayList扩容规则(不全)
0、描述
无参的ArrayList的初始容量为0:
ArrayList<Interger> list = new ArrayList<>();
list.add(10);
第一次扩容为长度为10(h)
下一次为上一次长度的1.5倍
h=h+h>>>1
1、扩容机制
2、fail-fast Vs fail-safe
fail-fast: 一旦发现遍历的同时其他人来修改,则立刻抛异常
==fail-safe:==发现遍历的同时其他人来修改,应当能有应对策略,例如牺牲一致性来让整个遍历运行完成
eg:
CopyOnWriteArrayList: fail-safe
ArrayList:fail-fast
二、LinkedList 与 ArrayList-时间性能对比
1.arraylist
- 基于数组的,需要连续内存
- 随机访问快(指根据下标访问)
- 尾部插入、删除性能可以,其他部分插入、删除都会移动数据,因此性能会低。(要进行复制操作)
- 可以利用cpu缓存,局部性原理
2.LinkedList
- 基于双向链表的,无需连续内存
- 随机访问慢(要沿着链表遍历)
- 头尾插入删除性能高。(中间位置不大行)
- 占用内存多(Node对象内存大)
3.总结
平均评估,arrayList好一点
三、局部性原理-arraylist具有优势的原因
- (arrayList)出于一个假设,在一个变量被访问时,他相邻的变量也有很大几率被访问(所以cpu中缓存一个数据块而不是单个数据)
- 链表不能很好的配合cpu缓存和局部性原理来提升性能