Java原始碼分析之ArrayList

2021-07-01 18:39:11 字數 1844 閱讀 7099

自我學習原始碼,也借鑑了網上其他的資料,有寫的不準確的地方,請輕噴,謝謝

1)繼承自abstractlist類

2)實現了randomaccess介面,

randomaccess介面是list

實現所使用的標記介面,用來表明其支援快速(通常是固

定時間)隨機訪問。

此介面的主要目的是允許一般的演算法更改其行為,從而在將其應用到隨機或連續訪問列表時能提

供良好的效能。

在對list特別的遍歷演算法中,要盡量來判斷是屬於randomaccess(如arraylist)還是

sequenceaccess(如linkedlist),

因為適randomaccess list的遍歷演算法,用在sequenceaccess list上就差別

很大,即對於實現了randomaccess介面的類例項而言,

此迴圈

for (int i=0, ilist.get(i);

的執行速度要快於以下迴圈:

for (iterator i=list.iterator(); i.hasnext(); )

i.next();

容量預設大小是10(從jdk1.2開始),並且有新元素加入時,即呼叫add()後,會呼叫ensurecapacityinternal(int size)來維護陣列的大小,

在ensurecapacityinternal(int size)中當加入這個元素後如果容量大於當前的容量,則會呼叫grow()來新建乙個新的陣列,並將

之前的資料拷貝到這個新陣列中。

新陣列的容量預設是按照原來陣列的1.5倍大小增加

注意:size不一定等於elementdata.length,只有當size>elementdata.length時才會呼叫grow()

6.arraylist的建構函式

1)無參的建構函式,將空的陣列賦給arraylist物件的屬性elementdata。

2)帶引數的建構函式,引數為初始化的容量,如果引數小於0,則會拋引數不合法的異常,如果大於等於0,則會建立object陣列賦給arraylist物件的屬性elementdata。 3)

這個建構函式通過其他集合類物件來構造arraylist物件,呼叫arrays的靜態方法copyof(這個方法會呼叫底層的本地方法)來構造arraylist物件。

說明:結構改變包括:新增add(e),add(,int,e)、刪除元素remove(int),remove(object)等,或者明確的手動修改陣列大小。如果僅僅的是給乙個元素賦值,不屬於結構的改變。

結構改變有可能會引發的問題:可能會導致iterator報concurrentmodificationexception異常。

原因:當arraylist使用了iterator()方法產生自身對應的iterator來對陣列鍊錶的一些操作,都會通過checkforcomodification()來判斷當前獲得iterator之後,陣列鍊錶是否沒有通過這個iterator來操作

自身,而是通過自身的增加刪除方法來操作。

list list = collections.synchronizedlist(new arraylist(...));

**乙個問題:如原始碼所示,abstractlist已經實現了list介面了,但是在arraylist還是再次的

實現了list介面,這是為什麼?

解答:當然這是沒必要寫的,把它去掉也沒什麼大的問題,不過寫了的話,應該有原因的,可以

這麼想:

2.這麼做更明確,更加強調了這個類實現了list介面;

3.向後相容性,如果哪天這個arraylist不再實現list介面了,則arraylist肯定實現list介面,並不會改變。

vue原始碼之Array

目錄 響應式具體實現 陣列子集和新增元素的追蹤 array中的問題 object通過setter改變屬性的值,所以我們利用getter時傳送依賴收集,在setter時觸發依賴更新,而且vue將資料轉換成響應式資料是在資料初始化時,對object中之後的屬性新增和刪除操作,無法做到自動更新,而是通過v...

JAVA原始碼分析Collection之Map

map的底層實現 linkedlist陣列,乙個非常大的陣列,linkedlist中儲存的是myentry物件 包括key和value屬性的物件 因為要保證map中的查詢速度比較快,是基於雜湊演算法來實現的,雜湊的主要實現是依靠hashcode方法。hashcode的產生是基於,記憶體位址產生的,保...

Java原始碼分析之ArrayList

儲存arraylist中的內容 transient object elementdata non private to simplify nested class access 表示元素的數量 private int size transient 關鍵字,就是這部分不參與序列化 建構函式有三個 沒有...