当前位置: 首页 > news >正文

【八股文】ArrayList和LinkedList的区别

先讲讲两者是如何实现的

ArrayList

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
    
    transient Object[] elementData; 

    private int size;
}

 通过源码可以看出,ArrayList实现是基于数组实现的

LinkedList

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
{
    transient int size = 0;

    /**
     * Pointer to first node.
     */
    transient Node<E> first;

    /**
     * Pointer to last node.
     */
    transient Node<E> last;
}

private static class Node<E> {
        E item;
        Node<E> next;
        Node<E> prev;
}

 通过源码可以看出,LinkedList实现是基于双向链表的数据结构。

使用双向链表而不使用单链表是为了能支持反向遍历,快速删除尾部元素

接下来,我们分析下不同操作的情况下,它两的差异

列表头部插入

ArrayList每次头插都需要移动所有元素, 时间复杂度O(n^2)

LinkedList只需要修改指针,时间复杂度O(n)

随机访问

ArrayList直接通过索引计算内存地址,时间复杂度O(1)

LinkedList需要从头节点开始遍历,时间复杂度O(n)

空间复杂度对比

LinkedList比ArrayList多占用数倍的空间,因为LinkedList要多存前后指针等信息

总结

 最后留两个问题给大家思考下

//list是linkedlist
for(int i=0; i<list.size(); i++){
    System.out.println(list.get(i));
}
for(String s : list){
    if(s.equals("bug")){
        list.remove(s);
    }
}

上述代码有啥问题?

相关文章:

  • 如何用AI制作PPT,轻松实现高效演示
  • Windows 11 安装Docker Desktop环境
  • 使用 Java 获取咸鱼(微店)商品详情接口(micro.item_get)的完整指南
  • 剑指 Offer II 081. 允许重复选择元素的组合
  • [思考记录]关于AI辅助独立思考
  • 深度解析国产推理大模型DeepSeek:从入门到本地化部署!
  • (六)运算符 条件判断 类型转换
  • ShenNiusModularity项目源码学习(16:ShenNius.Admin.Mvc项目分析-1)
  • 鸿蒙开发:实现AI打字机效果
  • 【“以退为进“、“不得已而为之“与“风险对冲“的协同机制】
  • 大模型训练全流程深度解析
  • Deepseek-R1大模型微调实战技术深度解析
  • Qt 控件概述 QWdiget
  • 第一次使用腾讯云服务器部署项目记录与总结
  • Java 大视界 -- Java 大数据中的异常检测算法在工业物联网中的应用与优化(133)
  • ABAP语言的动态编程(4) - 综合案例:管理费用明细表
  • 如何配置 Docker 以实现无需 sudo 使用
  • 蓝桥杯十天冲刺-day1(getline读入空格)
  • 人工智能与人的智能,改变一生的思维模型【8】逆向思维
  • DeepSeek-R1大模型微调技术深度解析:架构、方法与应用全解析
  • 数说母亲节|妈妈的妈妈带娃比例提升,托举效果如何?
  • 盖茨:20年内将捐出几乎全部财富,盖茨基金会2045年关闭
  • 上海发布大风黄警:预计未来24小时内将出现8-10级大风
  • 陈丹燕:赤龙含珠
  • 轿车追尾半挂车致3死1伤,事故调查报告:司机过分依赖巡航系统
  • A股三大股指收涨:军工股掀涨停潮,两市成交近1.5万亿元