• LinkedList 对比 ArrayList


    **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又由元素,上指针,下指针组成,累计起来,所占内存就非常可观了

  • 相关阅读:
    ZTE ZXR10 5250 command hints
    常见的限流算法与实现
    Download Quartz持久化数据库下载地址
    李航老师《统计学习方法》第五章阅读笔记
    uni-app--》基于小程序开发的电商平台项目实战(三)
    Python中的单元测试与代码覆盖率:实践与问题解决
    在Ubuntu系统上实现免费电脑IP更改
    轻量级的资源授权:基于 OAuth 规范
    Java项目:96 springboot精品在线试题库系统
    《Linux驱动:块设备的读写流程( ll_rw_block 接口分析)》
  • 原文地址:https://blog.csdn.net/hfaflanf/article/details/126095251