對於每一個開發者來說,ArrayList每天我們都會使用到,但是討論到底層原理,有不少人對源碼的細節不瞭解,這樣在使用時會遇到瓶頸。本節就和大家一起探討ArrayList整體架構。
1. ArrayList架構
ArrayList的架構比較簡單,是一個數組結構,如下圖:
上圖是一個長度爲10的數組,從1開始計數。index表示數組的下標,從0開始計數,element是數組元素本身。
上圖是ArrayList類圖,從圖中可以清楚的看到ArrayList的繼承依賴關係。
ArrayList的其他特性
-
DEFAULT_CAPACITY 表示數組的初始化大小,默認是10,如下圖:
從源碼中可以看到,ArrayList的默認初始化空間是10,這個數字得記下。
-
modCount 統計當前數組被修改的版本次數,如果數組結構有變動,modCount +1,如下圖:
從源碼中可以看到,ArrayList的默認初始化空間是10,這個數字得記下。
-
modCount 統計當前數組被修改的版本次數,如果數組結構有變動,modCount +1,如下圖:
從上圖中可以看到,modCount的定義就是爲了檢測數組結構變化的,如果你細心點可以發現modCount使用了關鍵字transient修飾,這裏對transient進行一下掃盲。
transient關鍵字我們常用來修飾類變量,意思是當前變量是無需進行序列化的。在序列化時,就會忽略該變量,這些在序列化工具底層,就已經對 transient 進行了支持
-
size 表示當前數組的大小,如下圖:
size是ArrayList的大小,它包含的是元素的數量。
2. 數組
因爲在ArrayList架構的底層就是數組,所以在這裏對數組這種數據結構做一個簡單的介紹
數組這種數據結構相信你不管接觸哪種編程語言,數組都是你要學習的一種數據結構。相對於其他數據結構,數組也是比較簡單的一種數據結構,但是如果我們從原理上去研究數組,數組是有很多設計理念值得我們去研究的。
數組特性:
數組的下標是以0開始的,既數組中第n個元素的下標是n-1。如下圖所示:
Java中數組的簡單使用:
下面介紹在Java中數組的簡單使用,如下圖:
代碼:
package com.study.base.demo.entity;
/**
* <p>Title: Main</p>
* <p>Description: 數組的簡單使用</p>
* <p>Company: http://www.yinjiedu.com</p>
* <p>Project: base</p>
*
* @author: WEIQI
* @Date: 2020-2-3 0:06
* @Version: 1.0
*/
public class Main {
public static void main(String[] args) {
// 創建數組,給數組賦值
int[] array = new int[20];
for (int i = 0; i < array.length; i++) {
array[i] = i;
}
// 數組另一種創建並賦值
int[] heights = new int[] {168, 178, 169, 177};
for (int height : heights) {
System.out.println(height);
}
}
}
在實際的使用中,數組的所以可以分爲兩類:
有語意的索引:數組的索引代表實際的業務意義;
無語意的索引:數組的索引只是簡單的下標,沒有實際的業務意義。
其實大部分人在實際開發中,基本上不會去考慮數據是不是有語意,只是簡單的使用。我們知道,數組的最大優點就是能夠快速定位查詢,但是快速查詢的基礎就是使用索引。所以,在實際的使用中,最好使用數組有語意的場景。如果使用有語意數組解決不了當前問題,那麼可能選擇其他的數據結構會是更好的選擇。
想要了解實時博文,可以關注公衆號《編程之藝術》