object empty_elementdata = {}當前arraylist什麼都沒有
object defaultcapacity_empty_elementdata = {} 表示沒有指定capacity時,自動分配乙個空的array,和empty_elementdata 不同點在於,empty_elementdata 表示構建時生命capacity為0,而defaultcapacity_empty_elementdata 表示構建時沒有宣告大小
transient int modcount 當前list被改變的次數
底層使用grow(int mincapacity)實現grow(int mincapacity),將elementdata的元素copy到新的擴容後的陣列中,並且賦值回elementdata,modcount++,等待新元素的插入
計算oldcapacity = element.length (注意不是size)
計算newcapacity = oldcapacity + (oldcapacity >> 1) 相當於原來的1.5倍大小
如果newcapacity - mincapacity < 0實際要求的大小, 注意哦,newcapacity可能為負,因為溢位, 則賦值newcapacity = mincapacity
如果newcapacity - max_array_size > 0 ??? 做什麼麼
將原有的elementdata中的元素copy到新的size為newcapacity的陣列中,並且賦值回elementdata
grow(size + 1),擴容elementdata[size++] = e
summary: 綜合add的行為和constructor arraylist()可以看出,呼叫new arraylist()後,elementdata實際上為null,要等add(e)的時候,才會實際的分配default_capacity大小的空間
rangecheck(index)將index後的往前移
將原本array的最後乙個元素設定為null,這樣就可以被gc掉
size–
summary: 可以看出remove並不會實際上的縮小已經被擴大的elementdata的大小,所以 remove後 如果不用trimtosize,則可能會造成空間浪費
找到target o的indexsummary:使用fastremove(index)
沒任何synchronized欄位,所以不安全
不是無限大的,size最大為integer.max_value - 8
任何一次結構修改,都會導致modcount++(transient), 將某個位置的設定為某個值則不是結構修改modcount應該是iterator的時候用的,檢測concurrentmodification
擴容,或者刪除某個元素都會導致copy,並且還可能會造成空間浪費,所以trimtosize
擴容的方式 newsize = oldsize + oldsize >> 1, 1.5倍
new arraylist時, elementdata = {}, 只有add第乙個元素時,才會申請default_size的空間,所以new後直接訪問其中的任何乙個元素都會報錯
size是實際存放的元素的個數, 極大可能小於elementdata.size
今天讀一讀七天學會NodeJS
七天學會nodejs 本章介紹了有關nodejs的基本概念和使用方法,總結起來有以下知識點 本章介紹了使用nodejs編寫 前需要做的準備工作,總結起來有以下幾點 本章介紹了使用nodejs操作檔案時需要的api以及一些技巧,總結起來有以下幾點 本章介紹了使用nodejs操作網路時需要的api以及一...
ArrayList原始碼分析
arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...
ArrayList原始碼剖析
建構函式 有3個建構函式 1 在jdk原始碼中arraylist無參的建構函式,預設初始化大小是10 2 帶有指定大小引數的建構函式 3 帶有集合引數的建構函式 一 確定arrarlist的容量 1 若arraylist的容量不足以容納當前的全部元素,設定新的容量 原始容量 3 2 1。2 如果擴容...