ArrayList部分原始碼學習筆記

2021-07-23 16:39:29 字數 3947 閱讀 8772

一、線性表分為順序表和煉表兩大類

二、順序表

1、特點:(1)元素所佔的儲存空間是連續的 (2)元素在儲存空間按邏輯順序存放。

(3)查詢快,增刪慢

2、例如 arraylist: 基於陣列實現,類似於乙個動態陣列,容量可自增的,所以可通過角標獲取指定位置的元素

增加元素: 是建立大容量陣列,複製原陣列,再進行賦值元素的操作。

刪除元素: 複製陣列,將已刪除位置的元素置null。

陣列複製的主要方法: * 

@param

src

*            the source array to copy the content. 原陣列

*@param

srcpos

*            the starting index of the content in . 原陣列要複製的開始位置

*@param

dat

*            the destination array to copy the data into. 目標陣列

*@param

dstpos

*            the starting index for the copied content in .  目標陣列的開始位置

*@param

length

*            the number of elements to be copied.   要複製的長度

*  /

public static native voidarraycopy(object src, 

intsrcpos,

object dst, 

intdstpos, 

intlength);

(1)構造:

public class

arraylist

extends

abstractlist

implements

cloneable, serializable, randomaccess 

array = (capacity == 0 ? emptyarray.object : new object[capacity]);

}/**

* 建立乙個無參構造的arraylist

*/public arraylist() 

/*** 建立乙個包含collection的arraylist

*/public arraylist(collection<? extends e> collection) 

object a = collection.toarray();

if (a.getclass() != object.class) 

array = a;

size = a.length;

}

(2)新增:

/**

* 新增方法,新增到列表的尾部

* (1、宣告乙個空間大點的新陣列 2、將老陣列複製進去 3、將object賦值進去)

*/

@override

public

boolean

add(e object) 

a[s] = object;// 把元素新增進來

size = s + 1;// 長度+1

modcount++;// 計量器,只要陣列中元素動一下,它就+1

return

true;

}/**

* 新增方法,新增到指定位置

* (1、宣告乙個空間大點的新陣列 2、將老陣列複製進去, 移動位置將index空出來 3、將object賦值進index的位置)

*/

@override

public

void

add(

intindex, e object) 

// 當陣列長度容量足夠時,執行system.arraycopy方法實現陣列的複製

if (s < a.length)  else 

a[index] = object;

size = s + 1;

modcount++;

}/**

* 新增方法,將容器中所有元素新增到此列表的尾部

*(1、宣告乙個空間大點的新陣列 2、將要新增的集合轉成陣列  3、將兩個陣列複製到新陣列中)

*/

@override

public

boolean

addall(collection<? extends e> collection) 

object a = array;

int s = size;

int newsize = s + newpartsize; // if add overflows, arraycopy will fail

if (newsize > a.length) 

system.arraycopy(newpart, 0, a, s, newpartsize);

size = newsize;

modcount++;

return

true;

}

(3)刪除

/**

* 刪除列表中指定位置上的元素

*@param index the index of the object to remove.

*@return the removed object.

*@throws indexoutofbound***ception

*             when 

*/@override

public e remove(int index) 

@suppresswarnings("unchecked") e result = (e) a[index];

// 將刪除位置之後的元素向前挪動乙個位置

system.arraycopy(a, index + 1, a, index, --s - index);

// 將陣列末尾置空

a[s] = null; 

size = s;

modcount++;

return result;

}// 刪除列表中首次出現的指定元素(如果存在)

@override

public

boolean

remove(object object) 

}} else }}

return

false;}

(4)查詢

/**

* 查詢是否包含某個元素

*/

@override

public

boolean

contains(object object) 

}} else }}

return

false;

}

**:

ArrayList部分原始碼

預設初始容量 private static final int default capacity 10 空陣列,有參建構函式,引數為0時,將elementdata陣列賦值為empty elementdata private static final object empty elementdata ...

ArrayList原始碼分析

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

ArrayList原始碼剖析

建構函式 有3個建構函式 1 在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10 2 帶有指定大小引數的建構函式 3 帶有集合引數的建構函式 一 確定arrarlist的容量 1 若arraylist的容量不足以容納當前的全部元素,設定新的容量 原始容量 3 2 1。2 如果擴容...