Java源碼之ArrayList

編程語言 Java 科技 行走輪子 行走輪子 2017-08-29

關於ArrayList

相信ArrayList是小夥伴們在Java開發中經常會使用的類之一。那麼ArrayList究竟是一個什麼類呢。大概來說它是List
接口的可調整大小的數組實現。 實現所有可選列表操作,並允許所有元素,包括null。除了實現List接口之外,他的類還提供了一些方法來操縱數組的內部大小來存儲列表。 也就是說ArrayList內部是由數組實現,往ArrayList中放置元素也是默認按照先後順序進行放置;它的大小是可調整的,不用像使用數組一樣擔心它不夠存放數據(這裡排除內存限制)。

總的來說ArrayList不論從使用還是理解上都是比較簡單的,那麼讓我們來分析一下其中的一些關鍵方法吧。

關鍵成員變量

下面列出了ArrayList的關鍵成員變量,數量並不多,可以看到元素在ArrayList中是存儲在數組中的。

Java源碼之ArrayList

插入方法

最簡單的方法就是add一個元素,下面是這個方法的源碼。這個方法比較簡單,但我們看第一步是ensureCapacityInternal
,這個方法是檢測新size是否超出目前可容納的最大值,超出的話需要擴展容量,最後走到grow方法中,具體代碼下面已經給出。需要注意的是modCount++這一句,這個變量表示此列表已被結構修改的次數,結構修改是改變列表大小的那些修改,或以其他方式擾亂它,使得正在進行的迭代可能產生不正確的結果。也就是說在迭代的時候進行結構修改將導致程序出錯。

Java源碼之ArrayList

另外一個常用的插入就是在指定位置插入,例如在首位(index為0)的位置插入等等。下面是這部分的源碼,比較好理解,關鍵部分已經加上註釋。

Java源碼之ArrayList

其次還有addAll方法,分別為向列表最後插入和指定位置插入兩個方法,這兩個方法都是在add方法上延伸出來的,很好理解,不再贅述。

刪除方法

刪除元素也是我們經常使用的方法,首先看按照索引刪除元素。下面的代碼註釋已經比較明白,需要注意的是rangeCheck這個方法只檢測index是否大於等於size,不檢測是否小於0。這是因為是否小於0在訪問數組時進行檢測。

Java源碼之ArrayList

下面是根據刪除指定元素。指定的元素可以為null,在找到指定元素的位置(索引)後,通過fastRemove刪除元素。

Java源碼之ArrayList

還有用的比較多的是批量刪除,以其中一個方法為例,如下。可見這個函數交由方法removeAll處理。在removeAll中,並沒有刪除,而是遍歷每一個元素,判斷是否需要保留,不需要保留的會被需要保留的覆蓋。可能這句話不好理解,可以看一下具體的代碼。

Java源碼之ArrayList

查詢方法

查詢方法是必須瞭解的,因為我們存起來也是為了獲取。這個方法非常的簡單,只做簡單的參數檢驗,然後返回對應下標的元素。

Java源碼之ArrayList

總結一下

基本上把ArrayList涉及的關鍵函數都做了詳細說明。其餘的一些都比較好理解了。

請關注我的個人博客:http://blog.jerkybible.com/

相關推薦

推薦中...