ArrayList剖析

大家天天在用List,ArrayList一般來講應該是程序員用的最多的集合類了。

我們今天研究一下ArrayList。

總體來講,從底層數據結構或者源碼的角度看,List比Map或者Set要簡單。

底層數據結構

ArryList其實就是可變長數組。

初始化的時候,可以指定容量,不指定容量的話,ArrayList被初始化為空數組,首次存入數據的時候才進行容量初始化,初始化最小容量為10。

ArrayList的容量控制

每次存入數據到ArrayList的時候,首先檢查容量:

private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);}

如果ArrayList容量不能滿足本次數據存儲的要求的話,調用grow方法擴容:

private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}

grow方法首先檢查原容量擴容1.5倍是否能滿足要求,能滿足則擴容到原來的1.5倍,否則擴容到能滿足數據存入要求的容量。

擴容后調用Arrays.copyOf(elementData, newCapacity)把舊的數據copy到擴容后的新數組。Arrays.copyof方法其實也是調用System.arraycopy方法完成copy。

數據存入

調用add(E e)方法在ArrayList尾部追加數據。
調用addAll(Collection<? extends E> c)在ArrayList尾部追加集合c中的所有數據。

ArrayList支持追加數據到其指定位置(通過調用方法add(int index, E element)),底層通過調用System.arraycopy方法實現。

研究ArrayList源碼會發現其中大量使用System.arraycopy方法,所以,雖然ArrayList其實就是數組操作,但是性能也不至于太差。

獲取數據

使用ArrayList的時候我們一般會有兩種獲取數據的需求,一種就是獲取指定位置的數據,通過get(int index)方法獲取,因為ArrayList其實就是數組,所以,獲取指定位置的數據效率非常高,時間復雜度為O(1)。

另外一種就是判斷是否包含某一數據,調用contains(Object o)方法:

public boolean contains(Object o) {return indexOf(o) >= 0;}public int indexOf(Object o) {if (o == null) {for (int i = 0; i < size; i++)if (elementData[i]==null)return i;} else {for (int i = 0; i < size; i++)if (o.equals(elementData[i]))return i;}return -1;}

其實猜都能猜到他必須要遍歷數組了,所以效率不會太高。

其他

讀源碼的目的除了從底層徹底了解其工作原理之外,還有一個重要的目的就是學習最最NB的JAVA程序員的編碼思想和習慣。

比如釋放內存:

   private void fastRemove(int index) {modCount++;int numMoved = size - index - 1;if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved);elementData[--size] = null; // clear to let GC do its work}

比如代碼重用:

    public boolean retainAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, true);}public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);return batchRemove(c, false);}

retainAll是只保留參數集合中的數據,removeAll則正好相反,移除參數集合中的數據,兩個方法目的正好相反,則通過調用batchRemove、傳遞complement為true或false達到目的。

值得每個尤其是新手程序員認真學習。

晚安!

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

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

相關文章

回顧JAVA中的鎖機制

Java中的鎖機制 在Java中&#xff0c;鎖機制是多線程編程里保障數據一致性與線程安全的關鍵技術。 1. 內置鎖&#xff1a;synchronized關鍵字 synchronized是Java的內置鎖機制&#xff0c;能夠保證在同一時刻&#xff0c;只有一個線程可以執行被其修飾的代碼塊或方法。 用法…

YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目標檢測論文精讀(逐段解析)

YOLOv11: AN OVERVIEW OF THE KEY ARCHITECTURAL ENHANCEMENTS目標檢測論文精讀&#xff08;逐段解析&#xff09; 論文地址&#xff1a;https://www.arxiv.org/abs/2410.17725 Rahima Khanam and Muhammad Hussain Ultralytics公司發布 CVPR 2024 論文寫的比較簡單&#xff…

【Erdas實驗教程】025:遙感圖像輻射增強(霧霾去除)

文章目錄 一、霧霾去除原理二、霧霾去除案例一、霧霾去除原理 遙感影像霧霾去除的核心原理是消除大氣散射對電磁波的干擾,恢復地物真實反射信息。Haze Reduction 工具的原理: 該工具基于暗目標法(Dark Object Subtraction, DOS),適用于去除因大氣散射(霧霾本質是大氣顆…

Language Models are Unsupervised Multitask Learners :語言模型是無監督的多任務學習者

摘要 自然語言處理任務&#xff0c;如問答、機器翻譯、閱讀理解和摘要&#xff0c;通常通過在特定任務的數據集上進行監督學習來解決。我們展示了語言模型在訓練于一個包含數百萬網頁的新數據集——WebText——時&#xff0c;可以無需任何顯式監督就開始學習這些任務。當模型以…

SQL語句全攻略:從基礎到進階的編程之旅

目錄 一、引言二、SQL 基礎語法2.1 SQL 語句寫法順序2.2 關聯查詢2.3 數據處理常用函數和運算符 三、數據庫和表的基本操作3.1 創建數據庫3.2 使用數據庫3.3 創建表 四、基礎增刪改查操作4.1 插入數據&#xff08;增&#xff09;4.2 查詢數據&#xff08;查&#xff09;4.3 更新…

Kafka的下載安裝

目錄 一、前期準備 1、查看網卡&#xff1a; 2、配置靜態IP 3、設置主機名 4、配置IP與主機名映射 5、關閉防火墻 6、配置免密登錄 二、JDK的安裝 三、Zookeeper的安裝 四、Kafka的安裝 1、Kafka的下載安裝 2、修改配置文件 4、分發文件 5、修改其他節點broker.i…

opencv入門(6) TrackBar調整圖片和鍵盤響應

文章目錄 1 創建trackbar2 使用userdata傳入函數3 鍵盤響應 1 創建trackbar 1.trackbar名稱 2.創建在哪個窗口上 3.拖動trackbar改變的值 4.trackBar的最大值 5.trackbar改變時的回調函數 6. 帶入回調函數的數據&#xff0c;可以不用帶,是一個void指針 createTrackbar(“Value …

QT<33> 修改窗口標題欄背景顏色

前言&#xff1a; 在做項目或者開發QT軟件時&#xff0c;如果想要修改窗口標題欄背景顏色&#xff0c;發現沒有代碼可以直接設置&#xff0c;目前有兩種方法可以設置。 第一種&#xff0c;自定義一個界面類&#xff0c;用QLabelQWidget實現&#xff0c;QLabel當作標題欄。 第…

JavaEE-博客系統項目

項目介紹 準備工作 創建數據表 創建項目 添加依賴 創建對應目錄 除了基本的數據層mapper&#xff0c;業務層service&#xff0c;交互層controller&#xff0c;還創建了公共類的層common&#xff0c;枚舉類層enums&#xff0c;異常類層&#xff0c;和實體類層pojo。 配置項目配…

Java項目:基于SSM框架實現的軟件工程項目管理系統【ssm+B/S架構+源碼+數據庫+畢業論文+開題報告】

摘 要 現代經濟快節奏發展以及不斷完善升級的信息化技術&#xff0c;讓傳統數據信息的管理升級為軟件存儲&#xff0c;歸納&#xff0c;集中處理數據信息的管理方式。本項目管理系統就是在這樣的大環境下誕生&#xff0c;其可以幫助管理者在短時間內處理完畢龐大的數據信息&am…

[按鍵手機安卓/IOS腳本插件開發] 按鍵插件調試與判斷循環結構輔助工具

實現按鍵插件的核心原理 通過一個table類型的QMPlugin變量實現按鍵精靈調用Lua函數&#xff0c;例如 -- Lua代碼 -- 實現兩數相加求和 function QMPlugin.Add(a, b) return a b end 將以上代碼保存成.lua文件&#xff0c;例如test.lua后&#xff0c;放入按鍵精靈手機助手的p…

提示詞框架(9)--CARE

提示詞框架不止是AI的框架&#xff0c;也可以是我們的思考框架&#xff0c;拆解問題的方法&#xff01;&#xff01;&#xff01; CARE框架是一種用于優化提示詞設計的方法&#xff0c;它幫助用戶更有效地與AI進行交互&#xff0c;特別是在需要獲取特定信息或實現某些任務時。…

uniapp+vue2 input不顯示明文密碼,點擊小眼睛顯示或隱藏密碼

<u-input placeholder"請輸入密碼" prefixIcon"lock" :password"showPassword" v-model"formData.password"prefixIconStyle"font-size: 25px;color: #3C9CFF" border"none"><template slot"suffix…

時間序列的類增量學習:基準與評估

論文地址&#xff1a;https://dl.acm.org/doi/abs/10.1145/3637528.3671581 論文源碼&#xff1a;https://github.com/zqiao11/TSCIL 會議&#xff1a;SIGKDD 2024&#xff08;CCF-A&#xff09; 現實環境本質上是非平穩的&#xff0c;隨著時間推移常會引入新類別。這在時間序…

智能攻擊原理和架構

大家讀完覺得有幫助記得關注和點贊&#xff01;&#xff01;&#xff01; 智能攻擊系統基于**人工智能&#xff08;AI&#xff09;與大語言模型&#xff08;LLM&#xff09;技術**&#xff0c;通過**環境感知→自主決策→動態執行→對抗進化**的閉環架構實現高效網絡入侵。以下…

Beamer-LaTeX學習(教程批注版)【4】

眾所周知&#xff0c;隨著顯示器普及寬屏化&#xff0c;PPT排版需要多列化來充分利用頁面的橫向空間。 這節課我們來學習如何創建列&#xff0c;即在beamer中增加列內容&#xff0c;以及如何對齊列。 1 使用不同的寬度來創建列 在beamer中我們通過在頁面上使用columns環境來創…

通俗理解JVM細節-面試篇

文章目錄 前言JVM概述JVM是什么&#xff1f;解決了什么問題&#xff1f;JVM運行流程JVM 與 JRE&#xff0c;JDK的關系 JVM內存結構JVM區域劃分程序計數器棧堆方法區 類加載機制五個階段加載驗證準備解析初始化總結雙親委派模型 垃圾回收內存管理什么是GC&#xff1f;如何判定誰…

意識邊疆保衛戰:22:47深圳AI-BioFab人機融合危機全息實錄

前言 前些天發現了一個巨牛的人工智能免費學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站 &#x1f9e0;《意識邊疆保衛戰&#xff1a;22&#xff1a;47深圳AI-BioFab人機融合危機全息實錄》 副標題&#xff1a;機械義…

langchain從入門到精通(三十四)——RAG優化策略(十)父文檔檢索器實現拆分和存儲平衡

1. 拆分文檔與檢索的沖突 在 RAG 應用開發中&#xff0c;文檔拆分 和 文檔檢索 通常存在相互沖突的愿望&#xff0c;例如&#xff1a; 我們可能希望擁有小型文檔&#xff0c;以便它們的嵌入可以最準確地反映它們的含義&#xff0c;如果太長&#xff0c;嵌入/向量沒法記錄太多…

Javaweb - 7 xml

XML 是EXtensible Markup Language 的縮寫&#xff0c;翻譯過來就是可擴展標記語言。即&#xff0c;XML 和 HTML 一樣&#xff0c;都是標記語言&#xff0c;也就是說&#xff0c;它們的基本語法都是標簽。 特點&#xff1a; 1. 可擴展&#xff1a;即 XML 是允許自定義格式的。但…