Java 中的 ArrayList 和 LinkedList 區別詳解(源碼級理解)

🚀 Java 中的 ArrayList 和 LinkedList 區別詳解(源碼級理解)

在日常 Java 開發中,ArrayListLinkedList 是我們經常用到的兩種 List 實現。雖然它們都實現了 List 接口,但在底層結構、訪問效率、插入/刪除操作、擴容機制等方面差異明顯。

本文從實際源碼出發,結合內存結構與操作成本,詳細分析二者的異同,幫助你更合理地做出選型。


📦 1. ArrayList —— 基于數組的動態列表

? 底層結構

  • ArrayList 的底層是一個 動態對象數組 Object[] elementData
  • 內存中是 連續存儲
  • 元素個數由 size 字段控制,和數組容量 (elementData.length) 分開管理
transient Object[] elementData; // 存儲元素的數組
private int size;               // 實際元素個數

🚀 訪問性能

  • 由于數組結構內存連續,可以通過 起始地址 + 下標 × 元素大小 直接定位
  • 訪問效率為 O(1),非常快

🧱 添加元素的邏輯

  • 默認容量為 10,首次添加時觸發初始化

  • 如果容量不足,會執行 擴容(grow)操作

    • 擴容策略:原容量的 1.5 倍
    • 核心操作是新建數組 + 拷貝舊數據(System.arraycopy
int newCapacity = oldCapacity + (oldCapacity >> 1);
System.arraycopy(elementData, 0, newArray, 0, size);

🧹 刪除元素的邏輯

  • 如果刪除的是中間位置,需要將后面的元素全部 前移一位
  • 刪除最后一個元素后,會將該位置置為 null,防止內存泄露
System.arraycopy(elementData, index + 1, elementData, index, size - index - 1);
elementData[--size] = null;
  • ? 不會自動縮容,避免頻繁擴容/縮容帶來的性能波動(可以手動 trimToSize()

?? ArrayList 的缺點

  • 插入/刪除中間元素時會頻繁移動數組,效率低(O(n))
  • 擴容需要申請新數組并復制,性能有開銷

🔗 2. LinkedList —— 基于雙向鏈表的列表結構

? 底層結構

  • LinkedList 是典型的 雙向鏈表
  • 每個節點是一個 Node 對象,包含 prev, next, item
  • 元素在內存中 不連續存儲
private static class Node<E> {E item;Node<E> next;Node<E> prev;
}

🧱 插入/刪除性能優勢

  • 插入/刪除某個位置時,只需修改相鄰節點的指針,效率高
  • ? 不需要擴容,也不會拷貝數組

🐢 訪問性能劣勢

  • 鏈表無法通過下標快速定位元素
  • 訪問第 n 個元素需要從頭或尾遍歷(O(n))

?? LinkedList 的缺點

  • 每個元素多占用 2 個引用(prev 和 next)
  • 訪問性能差,尤其在需要頻繁隨機讀取場景下

🧮 ArrayList 與 LinkedList 對比總結

特性ArrayList(動態數組)LinkedList(雙向鏈表)
底層結構連續 Object[] 數組不連續的 Node 鏈表
訪問速度快,O(1) 隨機訪問慢,需要遍歷,O(n)
插入刪除慢,需要移動數組元素快,僅需改指針
擴容機制支持,擴容為 1.5 倍無需擴容
內存使用少(只存數據)多(每節點多兩個引用)
應用場景讀多寫少,隨機訪問場景寫多讀少,插入刪除頻繁場景

? 最佳實踐建議

  • 讀多寫少、頻繁按下標訪問 ? 用 ArrayList
  • 寫多讀少、頻繁插入/刪除中間元素 ? 用 LinkedList
  • 如果你在處理的是“隊列”或“棧”場景 ? 也可以考慮 DequeArrayDeque

🔚 總結

理解 ArrayListLinkedList 的底層結構,能幫助你在性能、內存、復雜度方面做出更合理的設計選擇。切記:

不要被接口迷惑,底層結構決定一切。


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/913146.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/913146.shtml
英文地址,請注明出處:http://en.pswp.cn/news/913146.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用OpenLayers調用geoserver發布的wms服務

1.前端vue3調用代碼 <template><div><div ref"mapContainer" class"map"></div></div> </template><script setup lang"ts"> import { ref, onMounted } from "vue"; import Map from &quo…

二十七、【測試執行篇】測試計劃:前端一鍵觸發測試 實時狀態追蹤

二十七、【測試執行篇】測試計劃:前端一鍵觸發測試 & 實時狀態追蹤 前言準備工作第一部分:后端 API 確認第二部分:前端實現 - 觸發執行與狀態輪詢第三部分:后端 API 增強第四部分:全面測試總結前言 一個完整的自動化測試流程,從測試用例的創建到報告的生成,最終都需…

60天python訓練營打卡day52

學習目標&#xff1a; 60天python訓練營打卡 學習內容&#xff1a; DAY 52 神經網絡調參指南 知識點回顧&#xff1a; 1.隨機種子 2.內參的初始化 3.神經網絡調參指南 a.參數的分類 b.調參的順序 c.各部分參數的調整心得 作業&#xff1a;對于day’41的簡單cnn&#xff0c;看…

【Modern C++ Part3】Understand-decltype

條款三&#xff1a;理解decltype decltype是一個怪異的發明。給定一個變量名或者表達式&#xff0c;decltype會告訴你這個變量名或表達式的類型。decltype的返回的類型往往也是你期望的。然而有時候&#xff0c;它提供的結果會使開發者極度抓狂而不得參考其他文獻或者在線的Q&…

前端批量請求場景

文章目錄 一、批量請求1、Promise.allSettled2、返回值穿透 二、案例1、 批量任務2、緩存優化3、另一種實現方式 一般時候前端都是簡單的查詢任務&#xff0c;復雜的數據獲取都是后臺處理好再返回&#xff0c;如果遇到接口流程化處理、數據組裝&#xff0c;可以參考一下。 一、…

芊芊妙音:智能變聲,玩轉聲音魔法

在當今豐富多彩的社交和娛樂環境中&#xff0c;聲音的魅力正逐漸被更多人發現和利用。無論是線上社交、短視頻創作還是直播互動&#xff0c;一個獨特而有趣的聲音總能讓人眼前一亮&#xff0c;甚至成為個人風格的一部分。《芊芊妙音》正是這樣一款能夠幫助用戶輕松實現聲音變換…

安防監控視頻匯聚平臺EasyCVR v3.7.2版云端錄像無法在web端播放的原因排查和解決方法

有用戶反饋&#xff0c;在使用EasyCVR視頻匯聚平臺時&#xff0c;發現云端錄像無法在Web頁面正常播放。為幫助大家高效解決類似困擾&#xff0c;本文將詳細剖析排查思路與解決方案。 用戶軟件版本信息&#xff1a; 問題排查與解決步驟&#xff1a; 1&#xff09;問題復現驗證…

vxe-upload vue 實現附件上傳、手動批量上傳附件的方式

vxe-upload vue 實現附件上傳、手動批量上傳附件的方式 查看官網&#xff1a;https://vxeui.com 安裝 npm install vxe-pc-ui4.6.47// ... import VxeUIAll from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...createApp(App).use(VxeUIAll).mount(#app) // ...上傳附件支…

leaflet【十一】地圖瓦片路徑可視化

前言 在開發調試過程當中&#xff0c;如果引入的是公司內部的Gis地圖信息或者一些第三方定制來的Gis地圖數據&#xff0c;當某一些地圖塊數據缺失的時候&#xff0c;要打開F12去一個個找那些鏈接&#xff08;去找對應的xy與layer&#xff09;失效、那么你可能需要使用以下插件…

ES6從入門到精通:模塊化

ES6 模塊化基礎概念ES6 模塊化是 JavaScript 官方標準&#xff0c;通過 import 和 export 語法實現代碼拆分與復用。模塊化特點包括&#xff1a;每個文件是一個獨立模塊&#xff0c;作用域隔離。支持靜態分析&#xff0c;依賴關系在編譯時確定。輸出的是值的引用&#xff08;動…

stm32 USART串口協議與外設——江協教程踩坑經驗分享

江協stm32學習&#xff1a;9-1~9-3 USART串口協議與外設 一、串口通信基礎知識 1、通信類型&#xff1a; 全雙工通信&#xff1a;通信雙方能夠同時進行雙向通信。一般有兩根通信線&#xff0c;如USART中的TX&#xff08;發送&#xff09;和RX&#xff08;接收&#xff09;線&am…

深度學習中的一些名詞

向前傳播 forward pass 在機器學習中&#xff0c;輸入的feature, 通過預測模型&#xff0c;輸出預測值&#xff0c;此過程稱之為向前傳播&#xff1b; 向后傳播 backward pass 為了將預測與真實值的產值減小&#xff0c;需要根據差值&#xff0c;更新模型中的參數&#xff0c;此…

鴻蒙系統(HarmonyOS)應用開發之手勢鎖屏密碼鎖(PatternLock)

項目概述 基于鴻蒙&#xff08;OpenHarmony&#xff09;平臺開發的手勢密碼鎖應用&#xff0c;旨在為用戶提供安全、便捷且具有良好交互體驗的身份驗證方式。通過手勢圖案輸入&#xff0c;用戶可以輕松設置和驗證密碼&#xff0c;提升設備的安全性和個性化體驗。 功能特點 手…

vue文本插值

好的&#xff0c;我們來詳細講解 Vue 中最基礎的數據展示方式&#xff1a;文本插值和在其內部使用的 JavaScript 表達式。 1. 文本插值 (Text Interpolation) 知識點: 文本插值是 Vue 中最基本的數據綁定形式。它使用“Mustache”語法&#xff08;雙大括號 {{ }}&#xff09;…

Python:線性代數,向量內積諧音記憶。

目錄1 先說結論2 解釋3 歡迎糾錯4 論文寫作/Python 學習智能體------以下關于 Markdown 編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、…

小程序導航設置更多內容的實現方法

在小程序中實現導航欄設置更多內容&#xff0c;可以通過以下幾種方式實現&#xff1a; 1. 使用原生導航欄自定義按鈕 javascript // app.json 或頁面.json中配置 {"navigationBarTitleText": "首頁","navigationBarTextStyle": "black&q…

SpringBoot 解決配置文件有黃色波浪線

在application.properties配置文件中有黃色波浪線&#xff0c;是警告!! 原因&#xff1a;編碼格式不一致&#xff01;&#xff01; 解決&#xff1a;Settings| Editor | File Encodings | 選擇UTF-8

在 Vue 3 中全局使用 Suspense 組件

Suspense 是 Vue 3 引入的一個內置組件&#xff0c;不需要引用可以直接用。用于處理異步依賴的等待狀態。雖然 Suspense 主要用于異步組件&#xff0c;但你也可以全局地使用它來管理整個應用的加載狀態。 全局 Suspense 的基本用法 1. 在根組件中使用 Suspense // main.js 或…

筆記/計算機網絡

Content 計算機網絡部分核心概念十大網絡協議一覽 計算機網絡部分核心概念 1. 什么是計算機網絡&#xff1f;它最基本的功能是什么&#xff1f; 計算機網絡是指通過某種傳輸介質將多臺獨立的計算機或設備連接起來&#xff0c;實現數據交換和資源共享的系統。其最基本的功能是數…

時頻圖數據集更正程序,去除坐標軸白邊及調整對應的標簽值

當數據集是時頻圖時可能有一個尷尬的問題&#xff0c;就是數據集制作好后&#xff0c;發現有白邊。 其實這也不影響訓練模型&#xff0c;可能對模型訓練效果的影響也是微乎其微的&#xff0c;于是大多數情況我會選擇直接用整張圖片訓練模型。但是&#xff0c;有的情況下&#x…