Arraylist
基礎(chǔ)信息
底層是一個(gè)object數(shù)組
Arraylist 是java里面Collection? 標(biāo)準(zhǔn)的一個(gè)集合,其底層是一個(gè)object數(shù)組。當(dāng)new一個(gè)空參的ArrayList的時(shí)候,會(huì)默認(rèn)生成一個(gè)空數(shù)組。
Arraylist上限是 Integer.MAX_VALUE - 8(Integer.MAX_VALUE? = ?2^31-1);
超過上限會(huì)報(bào)內(nèi)存溢出
這里為什么是Integer.MAX_VALUE-8? ,源碼上的解釋就一句話?
Some VMs reserve some header words in an array
?一些虛擬機(jī)會(huì)在數(shù)組中保留一些頭字。解釋起來就是:
Java對(duì)象在堆內(nèi)存中的存儲(chǔ)布局可以分為三部分:對(duì)象頭(object header),實(shí)例數(shù)據(jù)(Instance Data)和對(duì)齊填充(Padding);
對(duì)象頭包括
Mark Word:用于對(duì)象自身的運(yùn)行時(shí)數(shù)據(jù)存儲(chǔ),如HashCode,GC分代年齡,鎖狀態(tài)標(biāo)志,線程持有的鎖,偏向線程ID和偏向時(shí)間戳等;
Klass Pointer:對(duì)象指向它類元數(shù)據(jù)的指針,JVM通過這個(gè)指針長度來確定對(duì)象是哪個(gè)類的實(shí)例。
數(shù)組長度(只有數(shù)組對(duì)象才有):記錄數(shù)組對(duì)象的長度。
?
8 bytes(Mark Word的最大占用) + 8 bytes(Klass Pointer的最大占用) + 4 bytes(數(shù)組長度)+ 8 bytes(引用指針的最大占用:數(shù)組中存放的是對(duì)象的引用) + 4 bytes(padding:為了方便尋址,JVM要求對(duì)象大小要求是8的倍數(shù),不夠就填充) ==32 bytes
? 而int類型? 1位占4個(gè)byte, 8 int(整數(shù)) 就等于32 bytes(字節(jié)),所以是Integer.MAX_VALUE-8。但在實(shí)際使用時(shí)因?yàn)榭紤]到虛擬機(jī)堆大小,實(shí)際arraylist大小要遠(yuǎn)遠(yuǎn)小于Integer.MAX_VALUE-8 。
ArrayList? 默認(rèn)長度是10,使用Arrays.copyOf()進(jìn)行擴(kuò)容,每次=擴(kuò)容size是 原size的一半??(oldCapacity + (oldCapacity >> 1));
?Arrays.copyOf()源碼其實(shí)是調(diào)用了System.arraycopy?
?System.arraycopy 是原生方法。
public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
相當(dāng)于新建了一個(gè)空數(shù)組,再用原生方法把老數(shù)組的值復(fù)制進(jìn)去。從這一點(diǎn)可以看出ArrayList每次擴(kuò)容都需要?jiǎng)?chuàng)建新的數(shù)組,并且將原數(shù)組的值復(fù)制進(jìn)新的數(shù)組,新增的速度相對(duì)要慢。
查詢的時(shí)候先校驗(yàn)是否存在數(shù)組下標(biāo)越界
然后從數(shù)組中獲取
文章來源:http://www.zghlxwxcb.cn/news/detail-438425.html
LinkeList
LinkeList底層是個(gè)鏈表文章來源地址http://www.zghlxwxcb.cn/news/detail-438425.html
到了這里,關(guān)于java源碼----集合系列1----ArrayList,linkedList的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!