通過閱讀源碼內部實現可以更好的幫助我們理解類,今天要分析的是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