暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

集合框架:ArrayList vs LinkedList,谁才是真·扛把子?

导语
Java江湖风云再起!
ArrayList大货车号称“随机访问之王”,LinkedList小火车自诩“增删改查之神”。
一个靠数组横冲直撞,一个用链表蜿蜒蛇行,
究竟是货车的“直男式存储”更胜一筹,还是火车的“灵活走位”独步武林?
且看今日《Java集合争霸赛》——“内存江湖,谁主沉浮?”



第一幕:身世背景

ArrayList大货车

  • 出身:基于动态数组,内存连续如高速公路。

  • 绝学

    • 随机访问:凭下标直达目标,时间复杂度O(1)
      ,快如闪电。

    • 扩容大法:默认容量10,满载时自动扩容1.5倍,搬家公司の噩梦!


LinkedList小火车

  • 师承:双向链表,车厢(节点)通过指针前后相连。

  • 绝技

    • 头尾操作addFirst()
      removeLast()
      ,时间复杂度O(1)
      ,丝滑如德芙。

    • 灵活插队:任意位置插入删除,时间复杂度O(1)
      (找到位置后)。



第二幕:招式对决

招式一:随机访问(快递员送包裹)

ArrayList大货车

    list.get(10086);  // 快递员直接找到10086号仓库  
    复制

    LinkedList小火车

      list.get(10086);  // 快递员从车头开始,挨个敲门问:“是10086吗?”  
      复制
      • 翻车现场:时间复杂度O(n)
        ,等包裹送到,收货人已搬家!



      招式二:中间插入(小区新住户入住)

      ArrayList大货车

        list.add(500"新住户");   
        // 500号之后的住户全体右移,引发大规模抗议(数组拷贝)  
        复制
        • 痛点:时间复杂度O(n)
          ,插入越靠前,抗议越激烈!


        LinkedList小火车

          list.add(500"新住户");  
          // 乘务员找到499号车厢,挂上新车厢,改个门牌号完事  
          复制
          • 精髓:时间复杂度O(1)
            (找到位置后),但找位置仍需O(n)



          招式三:内存占用(仓库管理员の账本)

          ArrayList大货车

          • 优点:数组连续存储,内存利用率高,CPU缓存友好。

          • 缺点:预留空位(扩容机制),可能浪费内存。


          LinkedList小火车

          • 优点:按需分配车厢,内存零浪费。

          • 缺点:每个车厢多带两个指针(前后节点),内存开销翻倍!



          第三幕:隐藏BOSS现身

          Vector老古董

          • 必杀技:线程安全(方法级synchronized
            锁),但性能拉胯。

          • 自嘲:“ArrayList的爷爷,如今只能活在教科书里!”


          CopyOnWriteArrayList少侠

          • 奥义:写时复制,读操作无锁,适合读多写少。

          • 暴言:“线程安全?!!在座的各位都是弟弟!”



          终局:谁是扛把子?

          1️⃣ ArrayList大货车

          • 适用场景:高频随机访问、少增删(如缓存数据、配置列表)。

          • 翻车警告:避免在循环中频繁插入删除,否则内存搬到你怀疑人生!


          2️⃣ LinkedList小火车

          • 适用场景:高频头尾操作、中间插入删除(如队列、栈、LRU缓存)。

          • 禁忌:别手贱用for循环+get(i)
            遍历,否则时间复杂度O(n²)
            教你做人!


          3️⃣ 隐藏BOSS团

          • 需要线程安全CopyOnWriteArrayList
            (读多写少)、ConcurrentLinkedQueue
            (高并发队列)。

          • 需要快速搜索:换HashSet
            TreeSet
            ,别硬刚链表!



          江湖生存指南

          • 选ArrayList若

            • 95%的操作是get()
              set()

            • 数据量不大,或内存充足(别抠门!)。


          • 选LinkedList若

            • 频繁在头部或中间插入删除(比如实现队列)。

            • 内存紧张,且愿意用时间换空间。



          互动话题
          你在项目中用过哪些“集合翻车操作”?
          是ArrayList的ConcurrentModificationException
          ,还是LinkedList的“乌龟速度遍历”?
          留言区吐槽,点赞最高有机会送《Java集合防爆指南》!

          关注我,学最骚的集合,掉最少的头发! 💻
          (下期预告:《HashMap:哈希江湖的碰撞与征服》)


          警告

          • 不要用LinkedList
            做大量随机访问,否则你会体验到“程序员的绝望”!

          • 不要用ArrayList
            做高频插入删除,除非你想挑战CPU的怒火!


          文章转载自让天下没有难学的编程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论