對於每一個開發者來說,ArrayList每天我們都會使用到,但是討論到底層原理,有不少人對源碼的細節不瞭解,這樣在使用時會遇到瓶頸。本節就和大家一起探討ArrayList整體架構。
1.ArrayList架構
ArrayList的架構比較簡單,是一個數組結構,如下圖:
上圖是一個長度為10的數組,從1開始計數。index表示數組的下標,從0開始計數。element是數組元素本身。
上圖是ArrayList類圖,從圖中可以清楚的看到ArrayList的繼承依賴關係。
ArrayList的其他特性
- DEFAULT_CAPACITY 表示數組的初始化大小,默認是10,如下圖:
- modCount 統計當前數組被修改的版本次數,如果數組結構有變動,modCount +1,如下圖:
modCount在ArrayList中執行++操作發生在很多處,即只要數組結構有變動,modCount就會+1,modCount定義在ArrayList繼承的AbstractList類裡面,如下圖:
從上圖中可以看到,modCount的定義就是為了檢測數組結構變化的,如果你細心點可以發現modCount使用了關鍵字transient修飾,這裡對transient進行一下掃盲。
transient關鍵字我們常用來修飾類變量,意思是當前變量是無需進行序列化的。在序列化時,就會忽略該變量,這些在序列化工具底層,就已經對 transient 進行了支持
- size 表示當前數組的大小,如下圖:
size是ArrayList的大小,它包含的是元素的數量。
2.數組
因為在ArrayList架構的底層就是數組,所以在這裡對數組這種數據結構做一個簡單的介紹
數組這種數據結構相信你不管接觸哪種編程語言,數組都是你要學習的一種數據結構。相對於其他數據結構,數組也是比較簡單的一種數據結構,但是如果我們從原理上去研究數組,數組是有很多設計理念值得我們去研究的。
數組特性:
數組的下標是以0開始的,既數組中第n個元素的下標是n-1。如下圖所示:
Java中數組的簡單使用:
下面介紹在Java中數組的簡單使用,如下圖:
在實際的使用中,數組的所以可以分為兩類:
有語意的索引: 數組的索引代表實際的業務意義;
無語意的索引:數組的索引只是簡單的下標,沒有實際的業務意義。
其實大部分人在實際開發中,基本上不會去考慮數據是不是有語意,只是簡單的使用。我們知道,數組的最大優點就是能夠快速定位查詢,但是快速查詢的基礎就是使用索引。所以,在實際的使用中,最好使用數組有語意的場景。如果使用有語意數組解決不了當前問題,那麼可能選擇其他的數據結構會是更好的選擇。
本節主要分享了ArrayList的整體架構,考慮到我們看文章基本都是手機端,所以對於文章的篇幅我都不會寫特別長,每一個知識點都會分為幾個篇幅去分享,最後形成系列性文章。瞭解更多文章歡迎關注微信公眾號《編程之藝術》。
閱讀更多 編程之藝術 的文章