ArrayList的時間複雜度 - Java那些事兒專欄

ArrayList部分一共五篇文章了,而且引入了時間複雜度來分析,強烈建議你們必定要按順序閱讀,相關文章分別是:數組

一、ArrayList初始化 - Java那些事兒專欄源碼分析

二、ArrayList底層數組擴容原理 - Java那些事兒專欄post

三、時間複雜度 - Java那些事兒專欄debug

四、三顧ArrayList - Java那些事兒專欄3d

五、ArrayList的時間複雜度 - Java那些事兒專欄(本文)cdn

在之前的文章裏,咱們已經看過了add方法的源碼,還有一個add方法,咱們看一下, public void add(int index, E element) ,從指定位置添加元素對象

按照下標把元素添加到指定位置,想必你們都知道,咱們直接上源碼。blog

老規矩,咱們仍是畫一畫,當執行到System.arraycopy()這個方法時內存

我看到有些書上寫的是依次移動元素到下一格,這種說法不夠嚴謹,因此我再強調一遍,是依次複製插入位置及後面的數組元素,到後面一格,不是移動,所以,複製完後,arr[2],arr[3]指向對一個對象。element

在代碼執行完這一句


咱們debug驗證一下。

最後,在堆內存中建立李莫愁這個對象,把arr[2]的引用指向它。

再debug一下


最後咱們來講說ArrayLIst這個對象裏添加的時間複雜度:

若是咱們不指定位置直接添加元素時(add(E element)),元素會默認會添加在最後,不會觸發底層數組的複製,不考慮底層數組自動擴容的話,時間複雜度爲O(1) ,在指定位置添加元素(add(int index, E element)),須要複製底層數組,根據最壞打算時間複雜度是O(n)。

最後咱們說一說讀取元素,下面代碼是獲取List中下標爲2的元素

看一下源碼:

很簡單,讀取元素和數組長度無關,直接從底層數組裏去拿元素。

評論區有人說,爲何是「李莫愁」,看樣子是不太喜歡「李莫愁」,咱們能夠調用 set(int index, E element)方法來替換。

咱們看一看這個方法的源碼

很簡單,就是往指定位置放入元素,並返回原來的元素,最後咱們來畫一畫

圖中「李莫愁」已經沒有引用指向它了,JVM會在合適的時候回收它,底層數組第2個位置已經換成了「小龍女」,咱們debug驗證一下。


沒錯,已經換成小龍女了。


這是最後一期ArrayLIst源碼分析,引入了時間複雜度,最後,咱們來作個總結

根據前幾篇文章咱們能夠看出來,在ArrayList中,底層數組存/取元素效率很是的高(get/set),時間複雜度是O(1),而查找,插入和刪除元素效率彷佛不過高,時間複雜度爲O(n)。

當咱們ArrayLIst裏有大量數據時,這時候去頻繁插入/刪除元素會觸發底層數組頻繁拷貝,效率不高,還會形成內存空間的浪費,這個問題在另外一個類:LinkedList裏有解決方案,請期待後續文章講解。

查找元素效率不高,在HashMap裏有解決方案,請關注後續文章。


上一篇:三顧ArrayList - Java那些事兒專欄

下一篇:Arraylist與Vector的區別 - Java那些事兒專欄

注:本專欄文章首發於公衆號:saysayJava。全部示例代碼均已上傳至公衆號,須要請關注下載。

若是喜歡本系列文章,請爲我點贊或順手分享,您的支持是我繼續下去的動力,您也能夠在評論區留言想了解的內容,有機會本專欄會作講解,最後別忘了關注一下我。

轉載無限歡迎,但請註明「做者」和「原文地址」。轉載請在文中保留此段,感謝您對做者版權的尊重。如需商業轉載或刊登,請聯繫做者得到受權。

相關文章
相關標籤/搜索