近在回顧數(shù)據(jù)結(jié)構(gòu),想到JDK這樣好的代碼資源不利用有點(diǎn)可惜,這是第一篇,花了心思。篇幅有點(diǎn)長(zhǎng),希望想看的朋友認(rèn)真看下去,提出寶貴的意見(jiàn)。 :)
類(lèi)繼承體系圖
內(nèi)部原理
ArrayList 的3個(gè)字段
private transient Object[] elementData; //對(duì)象數(shù)組,用于存儲(chǔ) 持有對(duì)象的 引用 private int size; //代表了 ArrayList 的長(zhǎng)度。隨著插入 刪除 添加 而改變。 protected transient int modCount = 0; //從AbstractList繼承得到,這個(gè)字段最后介紹,先忽視它。
ArrayList保存的真的是對(duì)象嗎?
elementData 是一個(gè)Object 數(shù)組,這是為了兼容任何類(lèi)型(Java泛型是所有實(shí)際類(lèi)型共享一份代碼模板的?。。。?。數(shù)組保存的實(shí)質(zhì)是持有對(duì)象的引用(reference)。引用又可以理解為 對(duì)象的“遙控器”(如下圖)。
從底層點(diǎn)的角度說(shuō),引用實(shí)質(zhì)是指針的化身,因此ArrayList即便持有很多個(gè)對(duì)象,其本身(或者說(shuō)elementData 數(shù)組)保存的只不過(guò)是引用而已,內(nèi)存開(kāi)銷(xiāo)不會(huì)太大。
所以要強(qiáng)調(diào)的是:對(duì)于保存引用類(lèi)型,java中的數(shù)組,和各種集合類(lèi),持有的是對(duì)象的引用,而不是對(duì)象本身。
構(gòu)造函數(shù)
空ArrayList