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倍的容量,並初始化乙個新的陣列,將原有的資...