一周一原始碼之Vector原始碼解析

2021-08-22 18:16:44 字數 3979 閱讀 4934

vector本質上也是個可擴充套件的陣列,可以把它想象成執行緒安全的arraylist。執行緒安全的關鍵是synchronized關鍵字。

jdk1.8中,vector類的原始碼有1400余行,在這裡不會對諸多的方法一一詳細介紹,只針對核心、常用的**分為幾個部分來解析,以**arraylist的實現與特性。

與arraylist類似,其核心的資料結構,也是elementdata。

protected object elementdata;
elementcount

vector的實際大小

protected

int elementcount;

// 自增係數

protected

int capacityincrement;

// 陣列最大長度

private

static

final

int max_array_size = integer.max_value - 8;

// 無參構造方法,預設構造初始容量為10的vector

public

vector()

// 入參為初始容量的構造方法

public

vector(int initialcapacity)

// 入參為初始容量和增長係數的構造方法,最終會執行的構造方法

public

vector(int initialcapacity, int capacityincrement)

// 入參為乙個集合的構造方法

public

vector(collection extends e> c)

add

add方法有兩個,均為synchronized的方法

public synchronized boolean add(e e) 

// 向指定位置新增元素,與insertelementat方法功能相同

public

void add(int

index, e element)

public synchronized void insertelementat(e obj, int

index)

ensurecapacityhelper(elementcount + 1);

// 這裡使用system.arraycopy將指定位置以後的元素整體向後移動一位

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

elementdata[index] = obj;

elementcount++;

}

addelement

jdk注釋中說,這個方法在功能上與add是相同的。

只不過是沒有返回值而已。

public

synchronized

void

addelement(e obj)

addall

實際上將傳入的集合轉為陣列,然後追加到vector陣列的末尾或者指定位置。

public synchronized boolean addall(collection extends e> c) 

public synchronized boolean addall(int

index, collection extends e> c)

copyinto

將乙個陣列複製到vector

public

synchronized

void

copyinto(object anarray)

清空vector clear

遍歷全部元素置為null,與方法removeallelements功能相同

public

void

clear()

set

將指定位置的值置為傳入值,setelementat方法功能一致。

public synchronized e set(int

index, e element)

獲取vector大小capacity
public

synchronized

intcapacity()

判斷元素是否存在contains

通過呼叫的indexof方法。

public

boolean

contains(object o)

public

synchronized

intindexof(object o, int index) else

return -1;

}

indexof

有兩個indexof,其中乙個有兩個入參,從某個位置開始去查詢元素

public

intindexof(object o)

public

synchronized

intindexof(object o, int index) else

return -1;

}

獲取元素

獲取元素有兩個方法,實際上功能是一樣的,不過在丟擲異常的時候,異常資訊不一樣吧。

public synchronized e elementat(int

index)

return elementdata(index);

}

public synchronized e get(int

index)

獲取第乙個元素firstelement
public

synchronized e firstelement()

return elementdata(0);

}

獲取最後乙個元素lastelement
public

synchronized e lastelement()

return elementdata(elementcount - 1);

}

remove
// 根據index移除元素

public synchronized e remove(int

index)

// 移除指定元素,邏輯是先找到元素對應的位置,然後移除。但是問題在於,只能移除第乙個呀。

public

boolean remove(object o)

在新增元素的時候,都是要判斷是否擴容並執行的。

// 判斷vector所需的實際大小是否大於核心陣列的大小

private

void

ensurecapacityhelper(int mincapacity)

// 如果增長因子capacityincrement大於0,則按照增長因子擴容,否則就按照當前的容量翻倍。

private

void

grow(int mincapacity)

private

static

inthugecapacity(int mincapacity)

一周一更之RESET

最近遇到乙個問題 在存在防火牆的情況下,某些客戶端在某個時間段連線伺服器時會出現連線不上的問題,在客戶端側用wireshark抓包發現,在進行tcp三次握手過程中,對於客戶端的第乙個syn,伺服器端總以rst響應。年少不懂事的我,一開始以為是防火牆的問題,但是該同一源位址的客戶端便會出現這種情況,應...

第一周 周一

寫在前面 小寫字母代表vj順序,大寫字母代表cf實際順序 problem 今天用賭的方式選題做,我以為是拼題,沒想到是一組整題。第 別的比賽,a.b,c的難度適中。做題的時候已經知道是不按順序了,所以沒有開啟a題。瀏覽發現d題題目比較簡單,就開始分析。十分鐘沒有思路後,看了一下rank,轉而去做c題...

一周一總結(10)

1.校園網裡的ping結果 在學過一點網路原理後,自己在寢室和實驗室ping了一下,校園網登陸的 是 寢室電腦連的是交換機 室友的,自己這邊的埠壞了,原因不明 再連到埠上,輸入 ping 172.16.254.13 如果不聯網無法ping通。到實驗室主機之間可以相互ping通,也可以ping通172...