數據結構-ArrayList

文章目錄

  • 1. 線性表
  • 2. 順序表
  • 3. ArrayList
  • 4. ArrayList的問題以及思考
    • 4.2 增容的性能消耗問題
    • 4.3 空間浪費問題

1. 線性表

線性表(Linear List)是n個具有相同特性的數據元素的有限序列。線性表是一種在實際中廣泛使用的數據結構,常見線性表:順序表、鏈表、棧、隊列…

線性表在邏輯上是線性結構,也就是連續的一條直線。但是在物理上不一定是連續的,線性表在物理上存儲時,通常以數組和鏈式結構的形式存儲。

2. 順序表

順序表是用一段物理地址連續的存儲單元依次存儲數據元素的線性結構,一般情況下采用數組存儲。在數組上完成數據的增刪查改。

順序表的實現

package myDataStructure.ArrayList;/*** @Author: Author* @CreateTime: 2025-03-18* @Description:*/
public interface SeqList<T> {// 新增元素,默認在數組最后新增void add(T data);// 在 pos 位置新增元素void add(int pos, T data);// 判定是否包含某個元素boolean contains(T toFind);// 查找某個元素對應的位置int indexOf(T toFind);// 獲取 pos 位置的元素T get(int pos);// 給 pos 位置的元素設為 valuevoid set(int pos, T value);// 刪除第一次出現的關鍵字keyvoid remove(T toRemove);// 獲取順序表長度int size();// 清空順序表void clear();
}
package myDataStructure.ArrayList;import java.util.Arrays;/*** @Author: Author* @CreateTime: 2025-03-18* @Description: 支持泛型的動態數組的實現*/
public class MyArrayList<T> implements SeqList<T>{private Object[] array; // 內部使用 Object[] 存儲數據,因為 Java 的泛型會在運行時擦除類型信息。private int size;public MyArrayList(){array=new Object[10];}// 動態擴容private void checkCapacity(){if (array.length==size){array=Arrays.copyOf(array,size*2);}}// 添加操作的邊界檢查private void rangeCheckForAdd(int index) {if (index<0||index>size){throw new IndexOutOfBoundsException("index超出范圍");}}// 讀取修改操作的邊界檢查private void rangeCheckForGetAndSet(int index) {if (index < 0 || index >= size) {throw new IndexOutOfBoundsException("index超出范圍");}}@Overridepublic void add(T data) {checkCapacity();array[size]=data;size++;}@Overridepublic void add(int pos, T data) {checkCapacity();rangeCheckForAdd(pos);for(int i=size;i>pos;i--){array[i]=array[i-1];}array[pos]=data;size++;}@Overridepublic boolean contains(T toFind) {if (toFind==null){// 如果 toFind 是null,直接調用 array[i].equals(toFind) 會導致 NullPointerExceptionfor (int i = 0; i < size; i++) {if (array[i] == null) {return true;}}}else {for (int i=0;i<size;i++){if (array[i].equals(toFind)){return true;}}}return false;}@Overridepublic int indexOf(T toFind) {if (toFind == null) {for (int i = 0; i < size; i++) {if (array[i] == null) {return i;}}} else {for (int i = 0; i < size; i++) {if (toFind.equals(array[i])) {return i;}}}return -1;}@Overridepublic T get(int pos) {rangeCheckForGetAndSet(pos);return (T)array[pos];}@Overridepublic void set(int pos, T value) {rangeCheckForGetAndSet(pos);checkCapacity();array[pos]=value;}@Overridepublic void remove(T toRemove) {int pos=indexOf(toRemove);if (pos==-1){return; // 元素不存在,直接返回}for (int i=pos;i<size-1;i++){array[i]=array[i+1];}array[size-1]=null;// 清理最后一個元素size--;}@Overridepublic int size() {return size;}@Overridepublic void clear() {size=0;}public String toString(){StringBuilder sb = new StringBuilder("[");for (int i = 0; i < size; i++) {sb.append(array[i]);if (i < size - 1) {sb.append(", ");}}sb.append("]");return sb.toString();}
}

3. ArrayList

在集合框架中,ArrayList是一個普通的類,實現了List接口,具體框架圖如下:
圖片

  1. ArrayList是以泛型方式實現的,使用時必須要先實例化
  2. ArrayList實現了RandomAccess接口,表明ArrayList支持隨機訪問
  3. ArrayList實現了Cloneable接口,表明ArrayList是可以clone的
  4. ArrayList實現了Serializable接口,表明ArrayList是支持序列化的
  5. 和Vector不同,ArrayList不是線程安全的,在單線程下可以使用,在多線程中可以選擇CopyOnWriteArrayList
  6. ArrayList底層是一段連續的空間,并且可以動態擴容,是一個動態類型的順序表

4. ArrayList的問題以及思考

##4.1 插入或刪除元素的性能問題(時間復雜度 O(N))

ArrayList 底層是基于數組實現的,插入或刪除元素時,所有后續元素需要整體移動,導致時間復雜度為 O(N)。

  • 使用鏈表(LinkedList
    • 對于頻繁插入或刪除操作的場景,LinkedList 是更好的選擇。
    • LinkedList 是基于雙向鏈表實現的,插入和刪除的時間復雜度為 O(1)(只需調整指針),但隨機訪問的時間復雜度為 O(N)。
    • 適用場景:需要頻繁插入或刪除的場景,但隨機訪問較少。
  • 使用 ArrayDeque
    • 如果操作集中在首尾兩端,可以使用 ArrayDeque,它支持高效的首尾插入和刪除操作。
  • 優化插入/刪除的邏輯
    • 如果需要頻繁插入或刪除,盡量批量操作,而不是逐個操作。例如,先將需要插入的數據存儲在臨時集合中,最后一次性合并到目標集合。

4.2 增容的性能消耗問題

ArrayList 增容時需要重新分配新空間,并將舊數組的數據拷貝到新數組中,這會帶來性能開銷。

  • 預估容量,合理初始化 ArrayList 的初始容量

    • 在創建ArrayList時,盡量根據實際需求指定初始容量,避免頻繁增容。例如:

      ArrayList<Integer> list = new ArrayList<>(1000);
      

      這樣可以減少擴容操作的發生。

  • 使用 ArrayList.ensureCapacity() 方法

    • 如果知道大概需要插入的元素數量,可以在插入數據前調用ensureCapacity()方法手動擴容,避免多次增容。例如:

      list.ensureCapacity(1000);
      
  • 使用其他動態數據結構

    • 如果擴容的性能開銷成為瓶頸,可以考慮使用其他動態數據結構(如 LinkedListArrayDeque),具體選擇取決于場景需求。

4.3 空間浪費問題

ArrayList 增容時容量通常增長為原來的 2 倍,會導致未使用的空間浪費。

  • 手動調整容量

    • 在確定不再需要新增元素時,可以調用ArrayList.trimToSize()方法,將ArrayList的容量調整為當前元素的實際大小,減少空間浪費。例如:

      list.trimToSize();
      
  • 使用其他集合類(如 LinkedList

    • 如果對空間利用率要求較高,可以考慮使用 LinkedList,因為它的空間分配是動態的,不會預留多余的空間。
  • 動態調整容量增長策略

    • 如果對 ArrayList 的增容策略不滿意,可以自定義一個集合類,繼承自 ArrayList,并重寫其擴容邏輯。例如,可以改為按固定大小增長,而不是倍增。

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

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

相關文章

FastGPT 社區版快速部署指南

產品簡介 FastGPT 是基于大語言模型的智能知識庫系統&#xff0c;提供以下核心能力&#xff1a; ? 開箱即用 - 內置數據預處理、多模型對接、權限管理 ? 可視化編排 - 通過 Flow 工作流實現復雜問答邏輯設計 ? 多場景適配 - 支持客服機器人/知識檢索/數據分析等場景 &…

【css酷炫效果】純CSS實現科技感網格背景

【css酷炫效果】純CSS實現科技感網格背景 緣創作背景html結構css樣式完整代碼基礎版進階版(3D光線掃描版) 效果圖 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;上傳后更新 緣 創作隨緣&#xff0c;不定時更新。 創作背景 剛看到csdn出活動了&#xff0c;趕時間&a…

Android BLE 權限管理

前言 android 權限一直是比較活躍的 在藍牙權限這一塊又分新版和舊版 新版權限 android.Manifest.permission.BLUETOOTH_SCAN, android.Manifest.permission.BLUETOOTH_ADVERTISE, android.Manifest.permission.BLUETOOTH_CONNECT舊版權限如9.0以下 Manifest.permission.A…

vue3:十一、主頁面布局(左側菜單折疊展開設置)

一、實現效果 二、基本實現 1、菜單容器增加展開收縮方法 在菜單容器中開啟這個方法&#xff0c;值設置為一個變量 :collapseiscollapse 2、定義菜單收縮與否的變量 在js中初始化是否收縮的變量&#xff0c;初始值為不收縮(也就是展開) //左側菜單展開與收縮 const iscolla…

Chapter 4-15. Troubleshooting Congestion in Fibre Channel Fabrics

show zone member: Shows the name of the zone to which a device belongs to. This command can be used to find the victims of a culprit device or vice versa. 顯示設備所屬的區域名稱。該命令可用于查找罪魁禍首設備的受害者,反之亦然。 show zone active: Shows the…

使用 JDBC 插入數據并獲取自動生成的主鍵(如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列) 的完整示例代碼,包含詳細注釋

以下是使用 JDBC 插入數據并獲取自動生成的主鍵&#xff08;如 MySQL 的 AUTO_INCREMENT 或 Oracle 的序列&#xff09; 的完整示例代碼&#xff0c;包含詳細注釋&#xff1a; import java.sql.*;public class GeneratedKeysExample {// 數據庫連接參數private static final St…

網絡爬蟲【爬蟲庫request】

我叫不三不四&#xff0c;很高興見到大家&#xff0c;歡迎一起學習交流和進步 今天來講一講爬蟲 Requests是Python的一個很實用的HTTP客戶端庫&#xff0c;完全滿足如今網絡爬蟲的需求。與Urllib對比&#xff0c;Requests不僅具備Urllib的全部功能&#xff1b;在開發使用上&…

MTKAndroid12 解決SystemUI下拉框中,長按WIFI圖標會導致崩潰問題

解決SystemUI下拉框中&#xff0c;長按WIFI圖標會導致崩潰問題 文章目錄 場景參考資料修改文件解決方案日志源碼分析 總結 場景 在部分產品中偶發性發現&#xff0c; SystemUI下拉框下拉后長按WIFI圖標會導致崩潰問題&#xff0c;有時候是截屏、點擊Home 按鍵后&#xff0c;長…

第三十一篇 數據倉庫(DW)與商業智能(BI)架構設計與實踐指南

目錄 一、DW/BI架構核心理論與選型策略1.1 主流架構模式對比&#xff08;1&#xff09;Kimball維度建模架構&#xff08;2&#xff09;Inmon企業工廠架構&#xff08;3&#xff09;混合架構 二、架構設計方法論與實施步驟2.1 維度建模實戰指南&#xff08;1&#xff09;模型選擇…

XSS基礎靶場練習

目錄 1. 準備靶場 2. PASS 1. Level 1&#xff1a;無過濾 源碼&#xff1a; 2. level2&#xff1a;轉HTML實體 htmlspecialchars簡介&#xff1a; 源碼 PASS 3. level3:轉HTML深入 源碼&#xff1a; PASS 4. level4:過濾<> 源碼&#xff1a; PASS: 5. level5:過濾on 源碼…

2025年3月AI搜索發展動態與趨勢分析:從技術革新到生態重構

025年3月AI搜索發展動態與趨勢分析&#xff1a;從技術革新到生態重構 一、行業動態&#xff1a;巨頭布局與技術升級 谷歌推出“AI模式”&#xff0c;重新定義搜索體驗 谷歌上線全新“AI模式”&#xff0c;集成多模態交互與實時數據能力&#xff0c;用戶可通過文本、圖片或語音…

熔斷降級(Sentinel解決)

問題概述 在微服務架構中一定要預防微服務雪崩問題&#xff0c;微服務雪崩問題就是指在微服務架構中&#xff0c;當一個服務出現故障時&#xff0c;由于服務之間的依賴關系&#xff0c;故障可能會傳播到其他服務&#xff0c;從而導致了大規模的服務失敗&#xff0c;系統無法正…

Qt高分屏自適應

一.設置默認 DPI 感知 Windows 上的桌面應用程序可以在不同的 DPI 感知模式下運行。 這些模式可實現不同的 DPI 縮放行為,并且可以使用不同的坐標空間。 有關 DPI 感知的詳細信息,請參閱在 Windows 上開發高 DPI 桌面應用程序。 請務必顯式為進程設置默認 DPI 感知模式,以避…

TPCTF 2025 web 復現

文章目錄 baby layoutsafe layoutSafe Layout Revengesupersqli baby layout 在index.js文件中&#xff0c;看到了有使用DOMPurify庫來防止XSS操作 在package.json里可以看到版本是3.2.4,關于3.2.3是有繞過策略的。它會把script標簽清除掉&#xff0c;去看bot可以看到flag是放…

Agent Team 多智能體系統解析

引言 在人工智能技術高速發展的今天&#xff0c;"多智能體協作系統"&#xff08;Agent Team&#xff09;正成為突破效率瓶頸的關鍵技術。與傳統的單體AI不同&#xff0c;這種由多個專業化智能體組成的協同網絡&#xff0c;通過分工協作和動態調整&#xff0c;展現出…

【前端 vue 或者麥克風,智能語音識別和播放功能】

前端 vue 或者麥克風&#xff0c;智能語音識別和播放功能 1. 終端安裝 npm install recordrtc2.引入 import RecordRTC from recordrtc3.html&#xff08;根據自己業務更改&#xff09; <div class"Page"><el-form ref"mainFormRef" class&qu…

bootstrap 表格插件bootstrap table 的使用經驗談!

最近在開發一個物業管理軟件&#xff0c;其中用到bootstrap 的模態框。同時需要獲取表格數據。用傳統的方法&#xff0c;本人不想用&#xff0c;考慮到bootstrap應該有獲取表格數據的方法&#xff0c;結果發現要想實現獲取表格數據功能&#xff0c;需要通過bootstrap的插件實現…

HTML 圖像與多媒體元素:拓展學習邊界的進度記錄(一)

開篇&#xff1a;學習啟程 在前端開發的廣袤領域中&#xff0c;HTML 作為構建網頁的基石&#xff0c;其重要性不言而喻。而 HTML 圖像與多媒體元素&#xff0c;就像是為這座基石添上了絢麗的色彩與靈動的音符&#xff0c;賦予網頁更加豐富的表現力和交互性。作為一名熱衷于探索…

循環不變量原則——螺旋矩陣

題目&#xff1a;螺旋矩陣 本題相較于螺旋矩陣II的不同之處是&#xff1a;螺旋矩陣II的矩陣是n行n列的方陣&#xff0c;而本題的矩陣并不一定是方陣。所以在遵循循環不變量原則遍歷完矩陣后&#xff0c;還會有一行或者一列沒有遍歷。 1、行多列少&#xff08;多一列沒遍歷&am…

【前端】Visual Studio Code安裝配置教程:下載、漢化、常用組件、基本操作

文章目錄 一、Visual Studio Code下載二、漢化三、常用組件1、Auto Rename Tag2、view-in-browser3、Live Server 四、基本操作五、感謝觀看&#xff01; 一、Visual Studio Code下載 下載官網&#xff1a;https://code.visualstudio.com/ 進入官網后點擊右上角的Download &…