ArrayList部分一共五篇文章了,而且引入了時間複雜度來分析,強烈建議你們必定要按順序閱讀,本文是第1篇。數組
前些天的文章,反覆的畫圖,不停的重複,就是想讓你們理解,對象在內存中是什麼樣的。也是爲今天的及之後的講解打下基礎。若是要說你們在寫Java代碼的時候哪一個類用得最多,我想除了String,基本上就是ArrayList了吧,那今天咱們說說ArrayList。緩存
首先ArrayList是一個普通的類,咱們來看一段代碼:函數
首先:執行List<Person> list1 = new ArrayList<>();當看到new這個關鍵字的時候,咱們腦殼裏應該第一印象就是這貨在堆內存開闢了一塊空間,好咱們再來畫一畫。工具
注:常量池位於方法區,方法區位於堆內存,前面沒涉及到,因此沒畫方法區,如今補上
好,既然是new出來的,那咱們直接從構造函數入手,看一下構造函數作了什麼。post
很簡單,就一行代碼,繼續看一下,this.elementData和DEFAULTCAPACITY_EMPTY_ELEMENTDATA分別是什麼性能
紅框裏的內容是否是似曾相識?是的,和String同樣,底層是數組,惟一的區別是String底層是char[]數組(忘了的能夠複習一下,傳送門:String是一個很普通的類 - Java那些事兒),而這兒是Object[]數組,也就是說該數組能夠聽任何對象(全部對象都繼承自父類Object),執行完構造函數後,以下圖。this
注:static修飾的變量,常駐於方法區,咱們不須要new,JVM會提早給咱們初始化好,這個特性在實際開發過程當中,常常拿來作緩存。在 讓人疑惑的Java代碼 - Java那些事兒 一文中,咱們文中Integer的緩存就是最好的例子。static變量又叫類變量,無論該類有多少個對象,static的變量只有一份,獨一無二。
fianl修飾的變量,JVM也會提早給咱們初始化好。
transient這個關鍵字告訴咱們該對象在序列化的時候請忽略這個元素,後續咱們會講序列化,這兒先跳過。
繼續執行:List<Person> list2 = new ArrayList<>();debug
ArrayList這個類的做者真是好貼心,new的時候連緩存都考慮到了,爲了不咱們反覆的建立無用數組,全部新new出來的ArrayList底層數組都指向緩存在方法區裏的Object[]數組。3d
繼續執行Person person1 = new Person("張三")cdn
繼續,執行list1.add(person1),很少說,看源碼ArrayList是怎麼處理add的。
咱們先看ensureCapacityInternal方法,方法裏有個參數是size,看們先看一下這個size從哪來的。
原來是一個成員變量,相信你們看到size一猜就知道大概是幹嗎的了吧。好,咱們在圖裏的ArrayList對象裏補上它,size是int基本數據類型,成員變量初始化的爲0。
繼續往下看
ensureCapacityInternal方法是在add裏面調用的。
再看grow方法
跟進到Arrays這個工具類,很簡單
再看copyOf()方法
最後咱們來看一下System.arraycopy()方法,好奇怪,這個方法只有定義,卻沒有實現,方法用了一個native來修飾。native的方法,是由其它語言來實現的,通常是(C或C++),因此這兒沒有實現代碼。這是一個數組拷貝方法,你們還在寫for循環拷貝數組嗎?之後多用這個方法吧,簡單又方便還能得到得更好的性能。
注:native方法,咱們會後續會講解,咱們先關注本章內容。
因爲數組內容目前爲空,至關於沒有拷貝。折騰了這麼久,原來只是爲了建立一個默認長度爲10的Object[]數組,有些朋友說,直接new不就好了,這麼費勁,其實這裏面大有文章,別急,稍後會說,繼續畫圖。
再回過頭來看,add()這個方法,繼續往下執行:
很簡單,size如今是0,就是把傳進來的這個e(這裏是person1),放到list1的elementData[]下標爲0的數組裏面,同時size加1,老規矩,上圖。
注意看紅框裏,雖然咱們list1裏的elementData數組的長度是10,可是size是1,size是邏輯長度,並非數組長度。
如今debug一下,驗證咱們圖裏的內容:
好的,執行一下本文開始那段代碼,看結果:
順便看一看size()方法的源碼:
有人說,呀,就一個元素,在堆內存中佔了10個位置,好浪費呀,沒辦法,你要享受ArrayList的便利與豐富的API,就得犧牲一下空間做爲代價。
注:本專欄文章首發於公衆號:saysayJava。全部示例代碼均已上傳至公衆號,須要請關注下載。
若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。
轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權。