Vector原始碼解析 jdk1 8

2021-08-08 11:09:47 字數 2910 閱讀 1242

概述

vector實現了list的介面,底層同樣是基於陣列實現的,可以儲存null。功能結構與arraylist的類似,不同的是執行緒安全的。

建構函式

protected object elementdata;

protected

int capacityincrement;

public

vector()

public

vector(int initialcapacity)

public

vector(int initialcapacity, int capacityincrement)

建構函式中,初始化了儲存元素的陣列elementdata和容量增量的值。

新增元素add/addall

vector使用add來新增元素:

public

synchronized

boolean

add(e e)

private

void

ensurecapacityhelper(int mincapacity)

private

void

grow(int mincapacity)

private

static

inthugecapacity(int mincapacity)

使用add直接新增元素的時候,首先通過ensurecapacityhelper來確認儲存元素的陣列的容量時候足夠。如果不夠,則進行grow擴容,增量大小為:(容量增量*陣列長度)。確認完容量之後,直接將元素新增到陣列後面。

vector還提供了在指定位置上新增元素:

public

void add(int

index, e element)

public synchronized void insertelementat(e obj, int

index)

ensurecapacityhelper(elementcount + 1);

system.arraycopy(elementdata, index, elementdata, index + 1, elementcount - index);

elementdata[index] = obj;

elementcount++;

}

首先判斷index的合法性,然後通過system.arraycopy將元素插入到指定的位置中。

刪除元素remove/removeall

vector使用remove來刪除元素:

public

boolean

remove(object o)

public

synchronized

boolean

removeelement(object obj)

return

false;

}public

intindexof(object o)

//存在該物件時,返回當前索引值,否則返回-1

public

synchronized

intindexof(object o, int index) else

return -1;

}public

synchronized

void

removeelementat(int index)

else

if (index < 0)

int j = elementcount - index - 1;

//刪除對應index位置上的元素

if (j > 0)

elementcount--;

elementdata[elementcount] = null; /* to let gc do its work */

}

vector使用removeall來刪除元素:

public

synchronized

boolean

removeall(collection<?> c)

呼叫父類的方法,abstractcollection中removeall:

objects.requirenonnull(c);

boolean modified = false;

iterator<?> it = iterator();

while (it.hasnext())

}return modified;}

上面分析的add/addall/remove/removeall等方法都是介面list提供的方法,vector自身也提供了方法來操作元素:

//新增元素

public

synchronized

void

addelement(e obj)

//刪除元素

public

synchronized

boolean

removeelement(object obj)

return

false;

}//刪除所有元素

public

synchronized

void

removeallelements()

//清除所有元素

public

void

clear()

總結:

1. vector與arraylist一樣,都可以動態改變陣列的容量大小,可以通過索引下標來查詢指定位置的值。

2. 與arraylist最大的區別就是vector的操作都是執行緒安全的,所以它的執行效率比arraylist的低。

ThreadLocal 原始碼分析 jdk1 6

相信很多做分布式web開發的都封裝過這樣的乙個工具用來管理當前登入的使用者。在 裡面把使用者set進來 在controller 裡面get 出來使用 而且都是基於threadlocal 這個模板類來封裝的,出於好奇跟蹤進原始碼一 竟 這裡簡單寫個例子 public class baseloginco...

Vector原始碼解析 JDK1 8

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

JDk原始碼解析之四 Vector原始碼解析

具體的三個屬性 解釋看圖中注釋。vector沒有採取arraylist臨界值擴容的辦法,而是每次不夠的時候,直接根據capacity的值來增加。具體怎麼增加後面會說。vector的構造方法如下。簡單粗暴,如果呼叫無參建構函式,直接就將初始容量設定成了10,最終在右側的構造方法裡,將陣列的長度設定為1...