Array和ArrayList都是Java中兩個重要的數據結構,在Java程序中常用。而且ArrayList在內部由Array支持,瞭解Java中的Array和ArrayList之間的差別對於成爲一名優秀的Java開發人員也相當重要。java
另外一方面 ,ArrayList是Java Collection框架中的一個類,它是做爲動態數組引入的。因爲數組本質上是靜態的,即一旦建立後就沒法更改數組的大小,所以,若是須要一個能夠調整自身大小的數組,則應使用ArrayList。這是Array和ArrayList之間的根本區別。程序員
它也是Java面試中常常問到的問題之一,若是您正在爲下一份工做作準備,那麼瞭解這些詳細信息可能真的頗有用。面試
最好在某些點上對比二者,這更易於理解。所以,讓咱們看一下能夠Array與ArrayList有哪些區別吧。算法
數組是基礎編程組件或數據結構,但ArrayList是Java Collections框架(一個API)中的類。實際上,ArrayList是使用Java中的數組在內部實現的。由於ArrayList是一個類,因此它擁有類的全部屬性,例如,您能夠建立對象和調用方法,可是Array是Java中的對象,它不提供任何方法。它只提供一個公開的length屬性來爲您提供數組的長度,而且它長度是固定的。編程
因爲ArrayList基於數組,所以必定程度上二者性能至關。在某種程度上確實如此,可是因爲ArrayList提供了額外的功能,所以ArrayList和數組的性能存在一些差別,主要是在內存使用和CPU時間方面。對於基於索引的訪問,ArrayList和array均提供O(1)性能,可是若是添加新元素會觸發調整大小,則添加在ArrayList中能夠爲O(logN),由於這涉及在後臺建立新並數組從舊數組中複製元素到新的數組。ArrayList中的內存需求也不只僅是用於存儲相同數量對象的數組,例如int[]與ArrayList中相比,int[] 存儲20個INT變量所需的內存更少,這是由於ArrayList和wrapper類的對象元數據開銷很大。數組
ArrayList是類型安全的,由於它支持泛型,泛型容許編譯器檢查ArrayList中存儲的全部對象的類型正確正確。替換,但數組不支持Java中的Generic。這意味着沒法進行編譯時檢查,可是若是您嘗試將不正確的對象存儲到數組中(例如:將字符串存儲到int數組中),則array經過引起ArrayStoreException來提供運行時類型檢查。安全
簡而言之,ArrayList比普通的數組分散更靈活,由於它是動態的。它能夠在須要時自行增加,而Array佈局則沒法實現。ArrayList中還容許您刪除Array沒法實現的元素。經過刪除,咱們的意思不只是將零分配給相應的索引,還意味着將其他元素向下複製一個索引,而ArrayList中會自動爲您完成。數據結構
若是您首先開始使用ArrayList,那麼您將沒法在ArrayList上存儲基元。這是array和ArrayList之間的關鍵區別,由於能夠提供_存儲基本類型和對象_。例如,int []數字有效,但int的ArrayList無效。您如何處理這個問題?假設您想將int原語存儲到ArrayList中,那又如何呢?好了,在Java中您可使用包裝器類。所以,若是您只想將int 2存儲到ArrayList中,其他的操做將由自動裝箱完成。順便說一句,因爲自動裝箱,這種差別從Java 5開始並不明顯,由於您會看到ArrayList.add(21)徹底有效而且能夠正常工做。app
ArrayList 和 Array的另外一個重要區別是,前者支持Generic,但者來不支持Generic。因爲是協變類型的,所以能夠將泛型與它們一塊兒使用。這意味着編譯器不可能在編譯時檢查數組的類型安全性,但他們能夠驗證Array的類型安全性。那麼在用Java編寫類型安全的類時如何處理這個問題呢?好了,您能夠查看《Effective Java》中內容,在其中能夠聲明一個像E []這樣的副本,而後使用類型轉換。框架
ArrayList提供了更多的迭代方式,即Array只能經過循環索引一一訪問全部元素。例如:針對循環的加強和do-while來遍歷數組,但ArrayList還可使用Iterator和ListIterator類來遍歷。
因爲ArrayList在內部由數組支持,所以它公開了Array可能執行的操做,可是鑑於其動態特性,它尚未添加Array沒法執行的操做,例如,您能夠將元素存儲在array和ArrayList中,可是隻有ArrayList容許您刪除元素。雖然您能夠經過分配null使用數組來模擬到相應的索引,除非將多箇中間該索引上方的全部元素都向下移動一級,不然它不會像刪除。
ArrayList和Array都提供了檢索元素的方法,例如ArrayList的get()方法使用索引從數組中獲取元素,例如,Array[0]將返回第一個元素
。ArrayList還提供了清除和重用的操做,例如clear()和removeAll(),Array不提供該操做,可是您能夠循環遍歷Array併爲每一個索引分配null以模擬它。
數組僅提供一個length屬性,該屬性告訴您數組中的插槽數,便可以存儲多少個元素,它不提供任何方法來找出已填充的元素數和多少個插槽爲空,即元素。儘管ArrayList確實提供了size()方法,該方法告訴給定時間點存儲在ArrayList中的對象數量。size()始終與length不一樣,這也是ArrayList的容量。
數組和數組列表之間的另外一個顯着區別是,數組能夠是多維的,例如,您能夠具備二維數組或三維數組,這能夠表示矩陣和2D地形的很是特殊的數據結構。
到目前爲止,您已經看到了ArrayList和副本之間的區別,如今讓咱們集中討論一些類似之處。因爲ArrayList在內部使用數組,所以必然有不少類似之處,以下所示:
二者都容許您將對象存儲在Java中,而且彼此都是基於索引的數據結構,可提供O(1)性能來檢索元素,可是,若是對進行了排序和使用了二進制搜索算法,則沒有索引的搜索仍然是LOG(N) 。
Array和AArrayList都保持將元素添加到其中的順序。
您可使用索引搜索元素,即O(1),不然,若是未對片斷進行排序,則可使用線性搜索,這大約須要O(n)的時間,也能夠在對進行進行排序後使用二進制搜索Java,這是排序+ O(logN)。
這兩個數組和ArrayList容許空值,但請記住只有對象數組容許其存儲爲空,原始類型不能爲空,原始類型爲使用默認值。例如:int類型的0與 boolean類型的false 。
array和ArrayList都容許複製。
ArrayList模擬數組的性能,例如,若是您知道索引,則能夠進行O(1)訪問,可是它具備額外的內存開銷,由於它是一個對象,而且還擁有其餘數據以自動調整ArrayList的大小。
array和ArrayList都有從零開始的索引,即第一個元素從第零個索引開始。
這就是Java中數組與ArrayList之間真正的區別的所有。您應該記住的最重要的區別是,Array本質上是靜態的,即建立後就沒法更改其大小,可是ArrayList是動態數組,若是ArrayList中的元素數大於其閾值,則能夠調整自身大小。基於這種差別,若是預先知道大小並肯定它不會改變,則應該使用數組做爲數據結構來存儲對象;若是不肯定,則只需使用ArrayList。
「不積跬步,無以致千里」,但願將來的你能:有夢爲馬 隨處可棲!加油,少年!
關注公衆號:「Java 知己」,天天更新Java知識哦,期待你的到來!