ArrayList需要了解的事情

2021-10-05 13:43:09 字數 1709 閱讀 9464

arraylist 是日常開發經常使用到的容器類。它能夠方便的進行資料的查詢、替換。但是因為其低層實現的原因在資料容量、效能、執行緒安全上都存在問題,主要涉及到下面的內容:

(1)預設初始容量為 0,如果未指定容量則首次初始的容量為 10;同時其也是有容量限制的;

(2)新增元素會涉及到陣列擴容和陣列元素拷貝,刪除陣列元素時同樣也會涉及到陣列的拷貝,這都會影響效能;

(3)執行緒不安全,因為整個arraylist 中沒有涉及到執行緒安全的相關**;

下面是關鍵資訊的分析。

開啟arraylist 類之後,主要涉及到以下幾個屬性:

很顯然 arraylist 內部是通過資料來實現的,而資料就儲存在 elementdata 陣列中,且允許儲存的最大元素數是 max_array_size。

empty_elementdatadefaultcapacity_empty_elementdata主要用在例項化 arraylist 時。

當使用無參建構函式new arraylist()時預設陣列大小預設是大小為 0 的陣列。

當使用有參建構函式new arraylist(initcapacity)時,如果 initcapacity 小於等於 0 ,則預設陣列大小為 0 的陣列。

如下圖所示,add 過程主要涉及到兩步操作:arraylist 中陣列擴容;賦值;

陣列擴容的過程如下:

​ (1)計算新的容量;

​ (2)將陣列元素進行拷貝到擴容後的陣列;

如下面的**所示:

上面擴容時有兩步邏輯,

如果儲存資料的陣列大小為 0,則新建立的陣列大小時為 10;

如果新容量沒有超過最大容量,則使用新容量。新容量的計算 = 原來的容量 + 原來容量的一半,例如:

150 = 100 + 100 >> 1

在 arraylist 中提供了 fasetremove() 方法,其實現如下:

可以看到 aarraylist 有多處會用到 system.arraycopy() 方法。

因此在使用arraylist時,如果考慮到效能

(1)初始化時指定初始化的容量大小,避免 add() 操作時的資料擴容和陣列拷貝;

(2)避免陣列中資料的刪除操作;

arraylist 中還提供了很多實用方法,如果感興趣可以詳細閱讀其實現。

實戰tdd(1):體驗

程式語言選型 你需要了解的二三事

畢業之後一直混跡在創業公司,經歷過很多次產品從0到1的過程。產品在開發之前都會面臨乙個常見問題,即技術選型,首當其衝的是採用哪門程式語言來開發我們的產品。程式語言往大了講是很複雜的,語法,型別系統,編譯原理,編譯器,直譯器,記憶體模型,併發模型,工具鏈等等,單拿一點出來都能寫一本書。本次 chat ...

關於 使用者績效 ,你需要了解的二三事

作為產品設計者,應該花時間去思考如何滿足使產品更符合目標使用者的心理模型。使用者績效 或許是乙個比較嶄新的詞語,但在實際產品設計過程中產品經理或互動設計師往往會不自覺的使用它其中的一些要素,而在國外已經出現了比較系統的研究,以色列理工學院教授 i parush指出 使用者績效指的是感知 認知 情感以...

Fiddler 你需要了解的

官網 平台 支援所有作業系統和瀏覽器,對window支援比較好 主要功能 工作原理 系統 不過如果fiddler非正常退出,這時候因為fiddler沒有自動登出,會造成網 頁無法訪問。解決的辦法是重新啟動下fiddler.同類的其它工具有 httpwatch,firebug,wireshark 啟動...