ArrayList VS LinkedList:
One:
ArrayList:基于数组,需要连续内存
LinkedList:基于双向链表,无需连续内存
Two:
ArrayList:随机访问快(指根据下标访问)
LinkedList:随机访问慢(要沿着链表遍历)
点击ArrayList的源码:
点击LinkedList的源码:
ArrayList相比于LinkedList实现了RandomAccess接口
,那么接口到底有什么作用呢?
我们点开该接口的源码,如下所示:
Three:
ArrayList:尾部插入,删除性能可以,其他部分插入,删除都会移动数据,因此性能会低
LinkedList:头尾插入删除性能高
ArrayList:
当为尾部插入时,直接通过下标检索到最后一个位置将元素插入即可,但当为头部插入时,过程如下所示:
LinkedList:
当为插入元素的位置为头尾部时,性能很高,但是当为其他位置时,性能很低的原因是由于,需要一个个的寻找该位置,遍历的过程无非增加了时间,因此实际开发中,我们都是使用ArrayList,一方面是由于实际开发中很少出现要将元素插入头部或者尾部的这种情况,另一方面是由于ArrayList的各个方面的性能都要由于LinkedList
four:
ArrayList:可以利用CPU缓存,局部性原理
LinkedList:占用内存多
ArrayList:
引入CPU缓存
,可以缩短时间,当第一次读写某些数据时,将其写在CPU缓存中,等再次使用该数据时,就不需要重新从内存中访问了
局部性原理:
当我们将某些数据放入CPU缓存中时,不应该只放单独的某一个数据,而应该将与它相邻的一些数据都读入,因为该数据访问后,很大机率接下来要访问的就是与它相邻的
而局部性原理只能适用于数组,而不能适用于链表,原因如下:
那么为什么LinkedList占用内存空间大呢?
原因:每一个元素都有两个指针,一个用于指向下一个元素,一个用于指向上一个元素,少量的数据也许并不会体现出内存占用上的缺点,但当数据非常多时,指针累计占用的内存空间就会非常大