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大小capacitypublic
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)
獲取第乙個元素firstelementpublic
synchronized e firstelement()
return elementdata(0);
}
獲取最後乙個元素lastelementpublic
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...