Java原始碼分析之ArrayList

2021-07-28 04:44:02 字數 4351 閱讀 6269

//儲存arraylist中的內容

transient object elementdata; // non-private to simplify nested class access

//表示元素的數量

private

int size;

transient 關鍵字,就是這部分不參與序列化

建構函式有三個

//沒有引數時,構建乙個空的

private

static

final object defaultcapacity_empty_elementdata = {};

public

arraylist()

//當有乙個引數時,就是代表開多大的空間,注意,這裡並沒有設size的值哦

private

static

final object empty_elementdata = {};

public

arraylist(int initialcapacity) else

if (initialcapacity == 0) else

}

//用集合構造,轉成陣列後,返回給elementdata,返回若不是object將呼叫arrays.copyof方法將其轉為object

public arraylist(collection<? extends e> c) else

}

get方法
//正常的get方法

public e get(int

index)

//對index的檢測

private

void rangecheck(int

index)

//注意這個是沒有邊界檢測的

@suppresswarnings("unchecked")

e elementdata(int

index)

set方法
//有index的檢測,返回的是舊的值

public e set(int

index, e element)

add方法
//ensurecapacityinternal稍後講,除了為了有足夠大的空間,還有其他的作用

public

boolean

add(e e)

//在index位置處插入element

public

void add(int

index, e element)

//這裡檢測是否在那個區間內,個人感覺有點兒問題,比如,初始構造給了引數,接下來在某個位置add乙個數,換句話說,有了空間,但該位置沒數,此時該不該丟擲越界異常

private

void rangecheckforadd(int

index)

addall
//加入集合中的全部,多開空間

public

boolean

addall(collection<? extends e> c)

//在index位置上加入集合中的全部

public

boolean addall(int

index, collection<? extends e> c)

remove方法
//先看下是否越界,再移除,返回的是舊的值

public e remove(int

index)

//移除第乙個與o相等的物件,注意remove(int index)是移除index位置的,如果想要移除的object本身就是int該怎麼辦,hiahia

public

boolean remove(object o)

} else

}return

false;

}//和remove(int index)一樣,為什麼不直接呼叫呢?

private

void fastremove(int

index)

//移除fromindex,toindex中的元素(這個沒有判斷越界?

protected

void

removerange(int fromindex, int toindex)

size = newsize;

}

size方法
public

intsize()

isempty()方法
public

boolean

isempty()

indexof方法(o(n))
//返回o的第一次出現的下標,注意是從前往後依次遍歷的

public

intindexof(object o) else

return -1;

}

//返回o最後一次出現的位置,是從後往前依次遍歷的

public

intlastindexof(object o) else

return -1;

}

contains方法
//就是判斷第一次出現的位置,也是o(n),(我還以為會用hashset之類的呢

public

boolean

contains(object o)

toarray方法
public object toarray()
@suppresswarnings("unchecked")

public t toarray(t a)

clear
public

void

clear()

sublist
public listsublist(int fromindex, int toindex) 

//這裡fromindex > toindex並不會交換

static

void sublistrangecheck(int fromindex, int toindex, int size)

add時候的空間檢測
private

static

final

int default_capacity = 10;

//取當前需要的空間和10的最大值

private

void

ensurecapacityinternal(int mincapacity)

ensureexplicitcapacity(mincapacity);

}//看element的已有空間,是否能滿足

private

void

ensureexplicitcapacity(int mincapacity)

//取需要的空間與原來空間1.5倍中最大值

private

void

grow(int mincapacity)

//所需空間非常大時候的判斷,如果是integer.max_value,需要84m,注意爆棧

private

static

inthugecapacity(int mincapacity)

求elementdata與乙個集合的交集和差集
//差集

public

boolean

removeall(collection<?> c)

//交集

public

boolean

retainall(collection<?> c)

//設乙個complement變數來判斷是留或者去掉,感覺好機智啊

private

boolean

batchremove(collection<?> c, boolean complement) finally

if (w != size)

}return modified;

}

對於這個變數,大家可能會好奇是什麼用,是為了多執行緒中判斷是否被修改時使用,舉個例子

public

void

sort(comparator<? super e> c)

modcount++;}

至此,對arraylist有了基本的了解,其中很重要的itr沒有說明,打算專門開乙個說。

vue原始碼之Array

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

Java原始碼分析之ArrayList

自我學習原始碼,也借鑑了網上其他的資料,有寫的不準確的地方,請輕噴,謝謝 1 繼承自abstractlist類 2 實現了randomaccess介面,randomaccess介面是list 實現所使用的標記介面,用來表明其支援快速 通常是固 定時間 隨機訪問。此介面的主要目的是允許一般的演算法更改...

JAVA原始碼分析Collection之Map

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