ArrayList源碼分析與內部實現(jdk1.9)

本帖最後由 空白都是空白 於 2018-6-12 18:16 編輯

         通過閱讀源碼內部實現可以更好的幫助我們理解類,今天要分析的是Arraylist的源碼。new一個ArrayList類,點擊ctrl+ 鼠標左鍵就可以進入內部查看源代碼。

        主要了解一下幾個方面

        1、ArrayList的底層是數組

        2、ArrayList是不定長的,如何實現。

        3、嘗試寫一個自己的ArrayList.


初始化變量



構造器
 


指定初始容量的構造器



聲明elementData數組
 

聲明modCount計數器
 

add方法
 

grow方法
 



newCapacity(擴容機制)
 

ensureCapacity
 


size && empty

 

contains
 


總結:        1、由構造函數明確ArrayList的底層是數組。
                   2、既然底層是數組,那他的特性是查詢快,增刪慢,因爲增刪底層用到Arrays.copyOf()方法
                   3、由newCapacity知道當ArrayList集合需要擴容時,每次增加1.5倍的容量,又由grow()方法得知,擴容的方式是用
                        1.5倍的容量複製數組。當容量很大時,開銷很大,速度很慢。
注意事項:  1、網上分享的ArrayList源碼分析大都是jdk1.9之前的版本,我閱讀的是jdk1.9的源碼,擴容代碼由ensureCapacity抽取到了grow當中的newCapacity中
                    2、當ArrayList的容量足夠大,自動擴容至1.5倍有可能導致內存不足OutOfMemoryError.
                    3、源碼中默認初始容量爲10,但當你指定new ArrayList(4) 的時候 初始容量爲4  擴容爲 7 -->11 -->17  方式爲newlength = oldlength *1.5 + 1
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章