ArrayList原始碼理解

2021-07-13 02:16:31 字數 3012 閱讀 9740

與linkedlist原始碼理解放在一起查閱,效果更好

對隊成員變數的分析,可以知道arraylist的資料結構

對add()方法的分析,可以得知arraylist新增資料的效率不高

對get()方法的分析,可以看出arraylist查詢的效率非常高

對remove()方法的分析,可以了解到arraylist刪除資料的效率不高

與linkedlist比較,arraylist有以下特點:

查詢效率高

新增和刪除的效率不高

資料結構是陣列

從成員變數中可以看出,arraylist是用陣列object來儲存資料的

//容器預設大小

private

static

final

int default_capacity = 10;

//空的容器

private

static

final object empty_elementdata = {};

//容器,用來儲存資料

private

transient object elementdata;

//標記容器的大小

private

int size;

三個重寫的構造方法都是用來初始化容器

//構造方法

public

arraylist(int initialcapacity)

//構造方法

public

arraylist()

//構造方法

public

arraylist(collection<? extends e> c)

從下面的**中可以看出,arraylist是通過陣列賦值的方式來新增資料

//新增資料

public

boolean add(e e)

//向指定的位置新增資料

public

void add(int

index, e element)

從下面的**中可以看出陣列的大小是動態變化的,一般擴充倍數為1.5倍

//根據mincapacity來確定容器的大小

private

void

ensurecapacityinternal(int mincapacity)

ensureexplicitcapacity(mincapacity);

}private

void

ensureexplicitcapacity(int mincapacity)

//array的最大值

private

static

final

int max_array_size = integer.max_value - 8;

//擴中容器

private

void

grow(int mincapacity)

//處理容量巨大時的情況

private

static

inthugecapacity(int mincapacity)

說明:arraylist在新增資料的時,有時候會移動大量的資料,導致新增資料效率不高

從下面的**中可以看出,arraylist在查詢資料時,通過index直接鎖定記憶體,可以迅速地找到相應的資料

//獲取指定位置上的資料

public e get(int

index)

移除指定位置上的資料:remove(int index)

//移除指定位置上的資料

public e remove(int

index)

說明:

1. 移除操作實際上是乙個覆蓋資料的操作,是將後面乙個資料覆蓋到前乙個位置,如果是末尾的資料,則直接置空。

2. 與add()中的耗時操作類似:可能移動大量的資料導致低效率

移除特定的資料:remove(object o)

//移除容器中第乙個相應的資料

public

boolean remove(object o)

} else

}//容器中沒有相應的資料

return

false;

}//移除指定位置上的資料

private

void fastremove(int

index)

說明:與remove(int index)相比,多了一步遍歷查詢的操作

//根據object找到第乙個出現的位置

public

intindexof(object o) else

//沒有找,返回-1

return -1;

}

這裡**與linkedlist中的類似,都是遍歷對比。效率高也僅僅是這裡鎖定了記憶體。

了解了arraylist的原理,對我們優化**,提公升效率會有很大的幫助,這裡也給出使用建議:

如果查詢操作較多,使用arraylist的效果更好.

ArrayList 原始碼理解

擴容機制 原始碼如下 mincapacity 最小需要的容量,也就是說儲存資料的陣列最小需要mincapacity所指定小長度。private void ensureexplicitcapacity int mincapacity private void grow int mincapacity ...

簡單理解ArrayList原始碼

1.arraylist是動態擴容的,每次擴容為原來長度的1.5倍,並且採用的是懶載入策略,當第一次呼叫add方法時,陣列才會擴容為10 預設值 2.模擬實現list介面 public inte ce list 自己實現的myarraylist在構造方法中陣列就初始化大小為10,原始碼中在第一次呼叫a...

ArrayList原始碼分析

arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...