arraylist類圖如下:
arraylist的底層是由陣列實現的,陣列的特點是固定大小,而arraylist實現了動態擴容。
arraylist部分變數如下,在下面的分析中會用到這些變數。
1.1 無參構造器
初始化arraylist的時候如果不指定大小,則會建立乙個空陣列。
public arraylist()
1.2 指定陣列大小的構造器
建立乙個預估大小的陣列,指定大小後只是指定了陣列初始值的大小,不影響後面擴容,指定的好處就是可以節省記憶體及時間上的開銷。
public arraylist(int initialcapacity) else if (initialcapacity == 0) else
}二、新增元素、動態擴容
arraylist.add(e e)原始碼:
public boolean add(e e)
add()中elementdata[size++] = e很好理解,就是將元素插入第size個位置,然後將size++,我們重點來看看ensurecapacityinternal(size + 1)方法;
private void ensurecapacityinternal(int mincapacity)
ensureexplicitcapacity(mincapacity);
}ensurecapacityinternal()方法中判斷快取變數elementdata是否為空,也就是判斷是否是第一次新增元素,如果是第一次新增元素,則設定初始化大小為預設容量10,否則為傳入的引數。這個方法的目的就是獲取初始化陣列容量。獲取到初始化容量後呼叫ensureexplicitcapacity(mincapacity)方法;
private void ensureexplicitcapacity(int mincapacity)
ensureexplicitcapacity(mincapacity)方法用來判斷是否需要擴容,假如第一次新增元素,mincapacity為10,elementdata容量為0,那麼就需要去擴容。呼叫grow(mincapacity)方法。
// 陣列的最大容量
private static final int max_array_size = integer.max_value - 8;
private void grow(int mincapacity)
grow(mincapacity)方法對陣列進行擴容,擴容大小為原陣列的1.5倍,如果計算出的擴容容量比需要的容量小,則擴容大小為需要的容量,如果擴容容量比陣列最大容量大,則呼叫hugecapacity(mincapacity)方法,將陣列擴容為整數的最大長度,然後將elemetdata陣列指向新擴容的記憶體空間並將元素複製到新空間。
當需要的集合容量特別大時,擴容1.5倍就會非常消耗空間,因此建議初始化時預估乙個容量大小。
三、刪除元素
arraylist提供兩種刪除元素的方法,可以通過索引和元素進行刪除。兩種刪除大同小異,刪除元素後,將後面的元素一次向前移動。
arraylist.remove(int index)原始碼:
public e remove(int index)
刪除元素時,首先會判斷索引是否大於arraylist的大小,如果索引範圍正確,則將索引位置的下乙個元素賦值到索引位置,將arraylist的大小-1,最後返回移除的元素。操作圖如下,假如我要移除索引為1的元素:
四、總結
arraylist底層是陣列實現的,可以進行動態擴容,擴容大小為原來的1.5倍,雖然可以通過動態擴容,但是陣列非常大時會特別浪費空間,因此建議初始化時預估陣列大小。arraylist允許插入重複值和空值。arraylist實現了randomaccess介面,支援快速隨機訪問,就是可以通過索引快速查到某個元素,因此遍歷時使用for迴圈的方式效率更高。arraylist是執行緒不安全的,可以通過collections.synchronizedlist將其轉變為執行緒安全的集合,不過一般不會使用,vector和copyonwritearraylist是執行緒安全的,vector效能一般,逐漸被copyonwritearraylist取代了。
題解四十九
給你 n 個非負整數 a1,a2,an,每個數代表座標中的乙個點 i,ai 在座標內畫 n 條垂直線,垂直線 i 的兩個端點分別為 i,ai 和 i,0 找出其中的兩條線,使得它們與 x 軸共同構成的容器可以容納最多的水。說明 你不能傾斜容器,且 n 的值至少為 2。示例 思路 我們使用雙指標i j...
計算機網路 練習(一百四十九)
練習 一百四十九 在層次化網路設計中,不是分布層 接入層交換機的選型策略。a.提供多種固定埠數量搭配供組網選擇,可堆疊 易擴充套件,以便由於資訊點的增加而進行擴容 b.在滿足技術效能要求的基礎上,最好 便宜 使用方便 即插即用 配置簡單 c.具備一定的網路服務質量和控制能力以及端到端的 qos d....
(四十九)類方法
首先,我們知道,cin是istream類的乙個函式。cin.getline 的字首是cin,通過英文句號和getline 相連。因此,在這裡,getline 是istream的乙個類方法。cin.getline 是面對c 風格的字串使用的。而面對string風格的字串時,我們使用的是getline ...