ArrayList分析

  ①創建ArrayList()

     默認通過調用其構造方法ArrayList(int i)來完成ArrayLIst的創建,如:

    ArrayList list = new ArrayList(12);

    這時候在其構造方法內部其實是創建了一個大小爲12的Object的數組。

   當沒有傳入數組容量值得時候 默認會創建一個爲10的Object數組。因此ArrayList的實現是基於數組的方式來實現元素的存儲。

 ②插入對象:add(E)

   由於ArrayList是基於數組實現的,那麼當調用add()方法的時候,其實質就是向數組內添加新的元素。接下來看看其怎麼實現動態改變ArrayList大小的原理吧。

   當調用ArrayList的add()方法的時候 ,首先會ArrayList中已有的元素的數量增加1,產生一個最小容量值 minCapacity的變量,然後會將此值與ArrayList內部數組

  的大小進行比較,如果此值小於數組的大小 ,那麼會將次對象直接插入到數組的末尾處(自己猜測),如果此minCapacity的值大於數組的值 ,那麼說明該數組有可能已經不能

  容納更多的元素了,那麼這時候ArrayList會怎麼做呢?它會將原來的數組賦值給一個新的數組對象,但是這個新的數組數組對象的元素的個數的確定是怎麼實現的

  呢 ?計算方法爲 :會將原來的數組的大小*1.5+1,如果此值仍然小於之前的minCapacity的值,那麼就會以minCapacity的值作爲新的數組對象的大小,最後通過

 調用Arrays.copyOf()來生成新的數組對象。

 ArrayList還提供add(int,E)方法 。允許你添加特定爲的元素對象,但是前提這個位置是存在的,數組的容量是夠用的,實現方式上,會將index和其之後的元素向後挪動以爲,讓出原來的index的位置 來插入新的元素,可見這種方式是多付出一次數組的複製的。

  ③刪除對象 remove(E)

   當執行此方法的時候,會檢查要刪除的對象是否爲null,如果爲null會遍歷數組中已有的值,比較裏面的值是否爲null 如果爲null會刪除相應位置的對象,接着會將刪除對象位置之後的對象向前複製以爲,並將數組最後一個元素的值設置爲null來釋放對此對象的引用,如果裏面的值不爲null的話,會調用對象的equals方法比較對象是否相同 (也是要遍歷整個數組的),如果相同會刪除這個位置的對象,剩下的操作和爲null的操作一樣。

 另外ArrayList還提供了romove(int index)方法來刪除制定爲的對象 ,首先會檢查其是否會數組越界 ,但是不會遍歷整個數組,因此性能會比較好。

 ④獲取對象get(int index)

  傳入的值就是對象在數組中的位置 ,但是前提會檢查數組是否越界 ,如果沒有,那麼就會返回數組中位於此位置的對象。

 ⑤ 遍歷對象iterator()

  iterator是有ArrayList的父類AbstractList實現,當每次調用iterator()方法時,都會創建一個新的Itr實例,當調用此實例的hasNext()時,會比較當前數組的位置和數組中已經元素  的個數是否相等,如果相等說明到達末尾 ,返回false ,否則返回true。

 當調用next方法時候則會調用get(int)  來獲得相應的對象。

⑥判斷是否包含某個對象contains(E)
 這個操作會遍歷整個數組中已有的對象,如果E爲null,則直接判斷數組中是否有null 如果有就返回true,否則返回false。如果E不爲null,會調用equals方法來比較是否相等,  相等返回true 否則返回false。

 indexOf和lastIndexOf是獲取對象所在的位置,其中前者是從前往後尋找,後者正好相反。

總結:

 ArrayList是基於數組實現的,沒有容量的限制。

再刪除元素的時候,並不會減少數組的容量大小,可以調用ArrayList的trimeToSize()來縮小數組的容量。

ArrayList是非線程安全的。


發佈了5 篇原創文章 · 獲贊 3 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章