jdk1 8原始碼解析 ArrayList

2021-09-13 10:21:39 字數 2504 閱讀 1409

arraylist是乙個長度可調節的陣列,使用者只需向其中新增,刪除,獲取元素,可以向其中新增任何物件(包括null值),無需關係它的擴容,,縮減問題。它實現了list介面所有方法,它基本等價於vector,唯一不同的是它沒有任何同步手段,多執行緒環境須慎重考慮。

這裡唯一需要注意的是,它實現了乙個randomaccess介面,這個介面沒有任何方法宣告,是乙個標記介面,它是為了告訴使用者如果實現了這個介面那麼你的實現在演算法上應該for迴圈會比使用iterator更快,linkedlist則沒有實現這個介面,它則是iterator更快。

我們檢視collections工具類二分搜尋方法:

這就驗證了我們上面說的那句話,實現了這個介面的子類在隨機訪問時會更快(for迴圈),而沒有實現,則順序訪問會更加快(iterator迭代)。

它內部主要有兩個成員變數,elementdata用於儲存資料,size用於標記儲存了多少個元素,size總是按最大值顯示的(考慮多執行緒環境,新增元素先增加size)。

add(e e)末尾插入新元素

public

boolean

add(e e)

首先進行了擴容,最終呼叫的是grow方法:

從這裡我們知道每次擴容後的大小為原來的容量 n + n/2,例如原來的容量是10,擴容後的容量則成了15.

將新元素放到了原來的元素的後面,因為不用移動原來的元素,所以比較快。

add(int index, e e)指定位置插入新元素

public

void

add(

int index, e element)

檢查index位置是否合理(太小,太大)

同上,檢查是否需要擴大陣列容量。

將原來index後面的所有元素往後面移動乙個位置,這樣index位置就空出來了。

將新元素放到index位置,接著size加1

從這裡我們知道,因為每次插入都需要移動index後面的元素,所以效率很低,盡量避免使用該方法。其它的add方法同上類似,這裡不再贅述。

get(int index)

public e get

(int index)

獲取指定位置元素,直接返回陣列對應的位置,不需要額外操作,很快!(這也是為什麼它能夠實現了accessrandom)

remove(int index)

public e remove

(int index)

直接移動index後面的所有元素向前移動,覆蓋index位置,簡單粗暴。 從這裡我們知道需要移動陣列,效率並不高。

index(e e)查詢元素位置

public

intindexof

(object o)

else

return-1

;}

遍歷查詢第乙個equals要找的的元素的位置,返回,簡單粗暴。

最後我們介紹下另乙個方法trimtosize():

public

void

trimtosize()

}

這個方法是用來縮減空間的,當你的arraylist裝的東西已經確定以後(以後不會再刪除,新增),可以呼叫這個方法節省記憶體空間。 它會把陣列的長度縮減得和size一樣。

arraylist內部使用乙個陣列儲存資料,使用乙個size變數標記儲存了多少個元素。

它可以儲存任一物件,包括null,當向其中新增元素時,會進行擴容操作,每次擴容增加的大小為原來陣列長度的一半。所以最好使用之前能夠估計好元素的數量。

查詢元素,末尾插入元素很快,指定位置插入元素,移除元素效率很低,因為需要移動陣列。 所以查詢操作多推薦使用arraylist,刪除操作多時推薦使用linkedlist。

可以呼叫trimtosize」**「。

繼承了乙個accessrandom標記介面,繼承者在演算法實現上應該考慮for迴圈遍歷元素要快於iterator遍歷。

關注我,這裡只有乾貨!

Vector原始碼解析 jdk1 8

概述 vector實現了list的介面,底層同樣是基於陣列實現的,可以儲存null。功能結構與arraylist的類似,不同的是執行緒安全的。建構函式protected object elementdata protected int capacityincrement public vector ...

HashSet原始碼解析 JDK1 8

在我們學過hashmap之後,再來看hashset就很easy了。因為hashset是基於hashmap是實現的。開啟hashset的原始碼,可以看到維護了乙個hashmap 一 成員變數 用來儲存 hashset 的元素private transient hashmap,object map 這個...

Vector原始碼解析 JDK1 8

ensurecapacity int mincapacity 擴容public synchronized void ensurecapacity int mincapacity private void ensurecapacityhelper int mincapacity private voi...