您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關java中ArrayList如何使用,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
public void trimToSize()
這個方法想必很多人都沒有用過甚至不一定知道ArrayList有這個方法,那么這個方法是做什么的呢?從該方法的介紹上可以得知該方法是將內部的數組最小化,怎么最小化呢?就是當前內部如果數組長度是100,而實際使用的(放入的有數據的)只有10,那么使用這個方法后會重新申請一個長度為10的數組,然后將數據從原數組中復制過來,然后將這個新的長度為10的數組引用賦給ArrayList對象作為內部數組,源碼如下:
如果你不是計算機專業的或者基礎不夠扎實的話可能會問:這么做有什么好處呢?那么這里我可以告訴你,這樣做的好處就是節省空間,因為如果內部數組很大但是實際使用到的只有很少一部分的話,多余的那部分數組空間雖然沒有存放東西,但是仍然是占用一定空間的,在有些內存緊張的場景這個小優化是很有必要的。同時根據源碼可以很容易得出該方法的時間漸進復雜度是O(n),其中n與當前ArrayList的size相同。
如果覺得文字不夠直觀的話,給大家上一段代碼,然后大家可以用jconsole觀察一下程序運行時堆內存的占用變化情況。
如果不會用jconsole又想看到結果的話我這里有運行好的截圖,大家可以看一下,截圖如下:
可以看到在程序執行到構建ArrayList對象的時候堆內存占用一下達到了1G多,而當調用trimToSize方法后堆內存又下降到了起始狀態,因此在ArrayList擴充到比較大的狀態后里邊的元素又被刪除了很多或者初始化ArrayList時構建了一個比較大的內部數組時(利用ArrayList的構造器),調用trimToSize會明顯改善堆內存的占用情況。但是,由于該方法的時間復雜度為O(n),其中n與ArrayList的size相關,當size比較大時該方法效率并不高,所以當size較大而內存又充足的情況或者ArrayList內部數組的使用率比較高的情況下(size/內部數組的長度,該值越大說明數組的使用率越高)不建議調用該方法,該方法也不建議頻繁調用。
ArrayList的構造器優化
看到上面的小標題可能有的人會問,ArrayList的構造器還能優化嗎?是的,確實能,上篇講到ArrayList的構造器有三個,其中有一個接收一個int類型值的構造器,而該構造器就是我們優化的重點。
根據上節知識可以得出,ArrayList的add方法通常是比較高效的,可以在O(1)的時間內完成,但是如果此時ArrayList內部數組的長度不夠需要擴容時,就需要調用grow方法擴容了,而該方法的時間漸進復雜度是O(n),其中n與當前size有關,所以該方法相對來說是比較低效的(實際在算法的世界O(n)的時間復雜度通常是比較高效的),那么如何減少該方法的調用次數就成了優化ArrayList性能的一個關鍵問題。
想要減少grow方法的調用,首先要知道在什么時候grow方法會被調用,而在前面我們已經說過,在需要擴容,也就是當前ArrayList內部維護的數組長度不夠的時候,該方法會被調用,那么如果我們的ArrayList內部維護的那個數組長度一直夠用,我們不就不需要調用這個方法了嗎?實際上,這種想法是可行的,因為我們可以通過ArrayList的構造器去控制ArrayList內部維護的這個數組的初始大小,而如果我們精確的知道我們將要往ArrayList中放入多少數據,那么我們就可以直接通過ArrayList的構造器去指定ArrayList內部維護的這個數組的初始大小,即使我們不確定我們創建的ArrayList對象將要放入多少數據,我們也可以估算一個相對較大的值,然后使用該值去構建ArrayList,以此達到盡量少的調用grow方法。
以上就是java中ArrayList如何使用,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。