(八)JDK源碼分析之集合框架ArrayList

  • 概述
    ArrayList是java集合框架中最常見的,也是用的最多的一種,底層採用的數據結構就是數組,使用和實現起來非常簡單。

  • 構造方法
    在這裏插入圖片描述
    說明:構造方法一共三個
    1.直接指定一個初始大小,直接創建這個大小的數組分配給ArrayList持有,size=0
    2.無參構造函數,直接創建一個空數組分配給ArrayList持有,size=0
    3.使用符合有界泛型集合的持有數組分配給ArrayList持有,並且初始化size

  • 擴容策略
    在這裏插入圖片描述
    在這裏插入圖片描述
    說明:當需要添加元素的時候,爲了確保空間夠用,是需要擴容的,步驟如下:
    1.調用calculateCapacity計算最少需要的容量,第一次返回默認最少需要10,後面返回的代表的就是實際需要佔用的數組元素個數
    2.調用ensureExplicitCapacity方法判斷需不需要擴容,至少需要的容量和已經分配給ArrayList持有的容量比較,當實際需要容納的數組元素個數大於分配給ArrayList持有的容量,那麼需要擴容
    3.調用grow方法進行擴容,擴容的策略就是轉爲原來的容量的1.5倍(首次初始大小是0,直接分配10個空間),第一次10,第二次15…

  • 添加單個元素
    在這裏插入圖片描述
    說明:這裏有兩個添加單個元素方法:
    1.直接插入元素到最後,擴容+版本號+1,賦值到數組最後一個元素,時間複雜度O(1)
    2.插入元素到指定下標,檢查數組有沒有越界,擴容+版本號+1,下標之後元素進行整體向後移動,指定下標賦值新元素,時間複雜度O(n)

  • 刪除單個元素
    在這裏插入圖片描述
    說明:有兩個刪除單個元素方法,一個指定下標刪除,一個指定對象刪除
    1.指定下標刪除,檢查下標合法性,版本號+1,計算移動數組元素數量,移動數組,將要被刪除元素被覆蓋,清空最後一個位置,元素真是數量size-1,時間複雜度O(n).
    2.刪除指定元素對象,遍歷數組,找到需要刪除的對象,然後使用下標去做刪除,後面流程就和1一樣
    3.刪除元素並沒有改變ArrayList持有的數組的真正長度,只是清空了數據,然後真正有效數據大小size做了保存

  • 獲取元素
    在這裏插入圖片描述
    在這裏插入圖片描述
    說明:直接返回指定下標的數組元素,時間複雜度O(1)

  • 集合的迭代器
    在這裏插入圖片描述
    說明:這裏迭代器方法其實就是我們常用的hasNext和next方法
    1.hasNext用於判斷是否還存在下一個元素,Itr類裏面直接初始化了一個遊標,遊標初始化爲0,直接和ArrayList持有的數組元素長度比較,就可以很簡單判斷有沒有下一個元素
    2.next方法就直接返回下一個元素,首先會檢查版本號,在獲取迭代器那一刻起,這個版本號就定下來了,所以如果獲取完迭代器後,對數組做了修改操作,那麼這個迭代器在迭代過程中會拋出ConcurrentModificationException異常,因爲你做了之後做了修改,這個迭代器很明顯拿到的數據已經不是最新的,迭代出來的數據也是錯誤的,這個獲取到的迭代器也就沒意義了。
    在這裏插入圖片描述
    在這裏插入圖片描述
    說明:所以,如果想要對獲得迭代器後,在迭代的同時做修改,必須使用迭代器的set,remove,add方法。那麼爲什麼呢?其實這個是非常合理的,因爲使用迭代器的方法去做修改操作,這樣就通知了迭代器,迭代器就可以對讀取的遊標cursor做同步修改,這樣就保證了迭代器讀取數據的準確性

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章