有序可重複
-arraylist:
1、底層是陣列;
2、預設容量為10;
3、最大容量為(integer.max_value-8);
4、擴容時新容量為舊容量的1.5倍,即新容量=舊容量*1.5;
5、非執行緒安全。
// 獲取當前容量
public
static
intgetarraylistcapacity(arraylist<?> arraylist) catch (nosuchfieldexception e) catch (illegalacces***ception e)
}
add方法
public
boolean
add(e e)
add方法就兩行**,1️⃣處表示判斷是否擴容;2️⃣處表示將加入的e放在陣列的末尾。
當出現併發的狀況時,來看下為什麼arraylist是執行緒不安全的
一、當底層陣列還有個空位置時
1、執行緒1執行1️⃣,因為有乙個空位置,則不擴容,此時執行緒1讓出cpu;
2、執行緒2執行1️⃣時因為有乙個空位置,則不擴容,當執行完2️⃣之後,陣列已滿;
3、然後執行緒1獲取cpu,開始執行2️⃣,此時資料已滿,再進行新增時,就會提示陣列下標越界
二、即將擴容
1、執行緒1執行1️⃣後,陣列開始擴容,然後執行2️⃣,size++的過程是讀-改-寫三個步驟,當size=10;
2、執行緒2執行1️⃣後,因為執行緒1已經進行了擴容,則不需要再進行擴容,執行2️⃣,因為執行緒還未執行++的操作,此時size=10;
3、所以兩個執行緒同時向size=10的下標寫資料時,就會出現髒資料的情況
那麼是如何進行擴容的呢?
private
static
intcalculatecapacity(object elementdata, int mincapacity)
return mincapacity;
}private
void
ensurecapacityinternal(int mincapacity)
private
void
ensureexplicitcapacity(int mincapacity)
3️⃣當進行無參建構函式時,在第一次呼叫add方法時會進行陣列的初始化,4️⃣獲取兩者最大值,mincapacity=0,default_capacity =10
以上步驟是初始化過程,真正擴容的原始碼如下:
private
void
grow(int mincapacity)
newcapacity是新陣列的長度,
newcapacity=oldcapacity+(oldcapacity>>1)
這句話的意思就是老陣列的長度+老陣列長度右移一位,newcapacity=1.5oldcapacity.
就是如果arraylist集合擴容,則擴容為以前的1.5倍。下面的**就很容易理解了,大家自行**,然後把老陣列的資料複製到新陣列中。
remove方法
public e remove(int
index)
6️⃣是判斷index是否合法,即index >= size則丟擲異常
/**
* runtime exception. this method does *not* check if the index is
* negative: it is always used immediately prior to an array access,
* which throws an arrayindexoutofbound***ception if index is negative.
*/private
void
rangecheck(int index)
7️⃣是獲取將要刪除的值
8️⃣是獲取將要移動的下標
9️⃣是把刪除位置後面的資料進行向前移動
從add方法和remove方法可以知道,插入和刪除都要對陣列進行複製和移動,效率相比會很低,所以arraylist不適合插入和刪除較多的業務邏輯
查詢
/**
* returns the element at the specified position in this list.
**@param index index of the element to return
*@return the element at the specified position in this list
*@throws indexoutofbound***ception
*/public e get(int index)
可以發現查詢很簡單,1️⃣1️⃣先判斷index是否合法,1️⃣2️⃣然後通過指定下標獲取值,時間複雜度為o(1),查詢是非常高效的 List Set 資料結構 Collections
常見的資料結構 棧 佇列 陣列 鍊錶和紅黑樹 棧 stack 又稱堆疊,他是運算受限的線性表,其限制是僅允許在標的一端進行插入和刪除操作,不允許在其 他任何位置進行新增 查詢 刪除等操作。特點 先進後出 即,存進去的元素,要在它後面的元素依次取出後,才能取出該元素 列如彈夾中的子彈 棧的入口 出口的...
常用資料結構
文章參考 資料結構 c語言版 嚴蔚敏 線性表 有頭有尾,中間節點有前驅有後繼 定義 一組連續的儲存單元依次儲存線性表的資料元素。定長順序表 typedef struct sqlist psqlist 不定長順序表 typedef struct dsqlist dsqlist,pdsqlist 單鏈表...
常用資料結構
function delete array element arr,pos for i pos 1 i length 1 i array pop arr return arr pos 3 echo 除第位置上的元素後 echo implode delete array element arr,pos...