ArrayList相關問題

2022-03-24 17:23:17 字數 1331 閱讀 6319

listlist = new arraylist<>(10);

list.add(「s」);

//屬性elementdata,arraylist就是乙個陣列

transient object elementdata;

public arraylist(int initialcapacity) else if (initialcapacity == 0) else

}

public boolean add(e e)

- 進入三個引數的add()
private void add(e e, object elementdata, int s)

- 繼續進入`grow(size + 1)`,注意:傳入引數為初始化容量 +1 ,在本例中為 11
private object grow(int mincapacity)

- 不難發現,其實擴容操作就是針對elementdata 屬性

- 將此陣列容量經過`newcapacity`(),形成乙個擴容後新的陣列,賦值給原陣列!

- 那麼擴容了多少呢?

- 進入`newcapacity(mincapacity)`

private int newcapacity(int mincapacity)

//判斷 newcapacity 是不是特別大(大到只比最大的integer小8)

//是的話,就進入hugecapacity() ,不做討論

//正常的話,直接返回乙個newcapacity

return (newcapacity - max_array_size <= 0)

? newcapacity

: hugecapacity(mincapacity);

- 那麼問題來了,為什麼擴容之前,要size+1,在本例中,入參為11

`int newcapacity = oldcapacity + (oldcapacity >> 1);`

- 採用如上方式計算新的容量,在於 >> 1

- 也就是轉成二進位制之後右移1

- 對於1,3,5,7等奇數,二進位制最後一位是 1 ,右移後末尾的1直接沒了

- 所以要 +1,使其變成偶數,在乘1.5

- 本例中,10+1變成11,右移,得到5

- 如果是9,變成10後,右移,得到5

- 綜上,若引數為`m`,實際擴容的容量數值 = m=奇數 ? m+1 * 1.5 : m*1.5!

ArrayList相關問題

使用者類 public class user public user int id,string name public intgetid public void setid int id public string getname public void setname string name 訂...

ArrayList相關整理

arraylist是什麼?arraylist是陣列列表,主要用來裝載資料。arraylist的底層實現 arraylist是用陣列來實現的。arraylist的特點 特點 查詢效率 增刪效率低,執行緒不安全。使 頻率很 底層是陣列,那麼我們為什麼可以存放任意數量元素 這個功能,是通過陣列擴容的方式實...

ArrayList相關面試題

arraylist的插入或刪除一定慢嗎?取決於插入或刪除的元素距離有多遠,如果不是最後乙個元素,則在插入或者刪除時,需要移動該位置往後的元素,在插入時且在陣列的末端,如果底層陣列的容量已經小於當前list容量,則根據arraylist的擴容機制需要增大1.5倍的容量,並初始化乙個新的陣列,將原有的資...