**LinkedList**
1. 基于双向链表,无需连续内存
2. 随机访问慢(要沿着链表遍历)
3. 头尾插入删除性能高
4. 占用内存多
**ArrayList**
1. 基于数组,需要连续内存
2. 随机访问快(指根据下标访问)
3. 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低
4. 可以利用 cpu 缓存,局部性原理
知识点1:为什么 LinkedList 随机访问慢,ArrayList 随机访问快呢?
进入 LinkedList、ArrayList 的原码看下
发现ArrayList实现了 RandomAccess 的接口,而LinkedList没有
RandomAccess翻译过来就是随机访问的意思
看下 RandomAccess 的声明,发现什么方法都没有,它就是一个标志性的接口,JDK的底层类库在实现时,会检查是否实现了RandomAccess,如果实现了,在查找其中某一元素时,就会使用下标来查找,速度快,否则使用迭代器,一个一个的查找
RandomAccess 原码也给出了例子,实现了RandomAccess,获取某个元素,根据下标直接get获取,如果没有实现,需要调用迭代器的 next() 方法才能得到下一个元素
知识点2:以前说 LinkedList 增删快,查询慢, ArrayList 增删慢,查询快,并不准确,准确来说,ArrayList 尾部插入、删除性能可以,其它部分插入、删除都会移动数据,因此性能会低;LinkedList 头、尾插入、删除性能高,中间部分性能差(因为中间插入、删除时,查找的过程,很耗时,一旦找到位置,进行插入、删除操的操作,这个过程很快)
头插入,ArrayList 比 LinkedList 慢
尾插入,ArrayList 比 LinkedList 不相伯仲
中间插入,LinkedList 使用了12毫秒,ArrayList使用了2毫秒,LinkedList 比 ArrayList 差很多
由此得出结论,LinkedList 仅在头部插入时,比 ArrayList 有优势,但是 ArrayList 的平均性能比
LinkedList 强,并且LinkedList 需要使用更多的内存,因此平时的使用过程中,多数情况使用 ArrayList;
知识点3:LinkedList占用内存多
LinkedList里面由一个个的node对象组成,每个node又由元素,上指针,下指针组成,累计起来,所占内存就非常可观了