ArrayList原始碼讀一讀

2021-10-09 02:17:00 字數 1815 閱讀 2065

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的index

使用fastremove(index)

summary:

沒任何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 如果擴容...