Java中Array與ArrayList的10個區別

Array和ArrayList都是Java中兩個重要的數據結構,在Java程序中經常使用。並且ArrayList在內部由Array支持,瞭解Java中的Array和ArrayList之間的差異對於成爲一名優秀的Java開發人員也至關重要。

另一方面 ,ArrayList是Java Collection框架中的一個類,它是作爲動態數組引入的。由於數組本質上是靜態的,即一旦創建後就無法更改數組的大小,因此,如果需要一個可以調整自身大小的數組,則應使用ArrayList。這是Array和ArrayList之間的根本區別。

它也是Java面試中經常問到的問題之一,如果您正在爲下一份工作做準備,那麼瞭解這些詳細信息可能真的很有用。

Java中的Array與ArrayList

最好在某些點上對比兩者,這更易於理解。因此,讓我們看一下可以Array與ArrayList有哪些區別吧。

1、Implementation

數組是基礎編程組件或數據結構,但ArrayList是Java Collections框架(一個API)中的類。實際上,ArrayList是使用Java中的數組在內部實現的。因爲ArrayList是一個類,所以它擁有類的所有屬性,例如,您可以創建對象和調用方法,但是Array是Java中的對象,它不提供任何方法。它只提供一個公開的length屬性來爲您提供數組的長度,並且它長度是固定的。

2、性能

由於ArrayList基於數組,因此一定程度上兩者性能相當。在某種程度上確實如此,但是由於ArrayList提供了額外的功能,因此ArrayList和數組的性能存在一些差異,主要是在內存使用和CPU時間方面。對於基於索引的訪問,ArrayList和array均提供O(1)性能,但是如果添加新元素會觸發調整大小,則添加在ArrayList中可以爲O(logN),因爲這涉及在後臺創建新並數組從舊數組中複製元素到新的數組。ArrayList中的內存需求也不僅僅是用於存儲相同數量對象的數組,例如int[]與ArrayList中相比,int[] 存儲20個INT變量所需的內存更少,這是因爲ArrayList和wrapper類的對象元數據開銷很大。

3、類型安全性

ArrayList是類型安全的,因爲它支持泛型,泛型允許編譯器檢查ArrayList中存儲的所有對象的類型正確正確。替換,但數組不支持Java中的Generic。這意味着無法進行編譯時檢查,但是如果您嘗試將不正確的對象存儲到數組中(例如:將字符串存儲到int數組中),則array通過引發ArrayStoreException來提供運行時類型檢查。

4、通用

簡而言之,ArrayList比普通的數組分散更靈活,因爲它是動態的。它可以在需要時自行增長,而Array佈局則無法實現。ArrayList中還允許您刪除Array無法實現的元素。通過刪除,我們的意思不僅是將零分配給相應的索引,還意味着將其餘元素向下複製一個索引,而ArrayList中會自動爲您完成。

5、基礎數據類型

如果您首先開始使用ArrayList,那麼您將無法在ArrayList上存儲基元。這是array和ArrayList之間的關鍵區別,因爲可以提供_存儲基本類型和對象_。例如,int []數字有效,但int的ArrayList無效。您如何處理這個問題?假設您想將int原語存儲到ArrayList中,那又如何呢?好了,在Java中您可以使用包裝器類。因此,如果您只想將int 2存儲到ArrayList中,其餘的操作將由自動裝箱完成。順便說一句,由於自動裝箱,這種差異從Java 5開始並不明顯,因爲您會看到ArrayList.add(21)完全有效並且可以正常工作。

6、泛型

ArrayList 和 Array的另一個重要區別是,前者支持Generic,但者來不支持Generic。由於是協變類型的,因此可以將泛型與它們一起使用。這意味着編譯器不可能在編譯時檢查數組的類型安全性,但他們可以驗證Array的類型安全性。那麼在用Java編寫類型安全的類時如何處理這個問題呢?好了,您可以查看《Effective Java》中內容,在其中可以聲明一個像E []這樣的副本,然後使用類型轉換。

7、迭代性

ArrayList提供了更多的迭代方式,即Array只能通過循環索引一一訪問所有元素。例如:針對循環的增強和do-while來遍歷數組,但ArrayList還可以使用Iterator和ListIterator類來遍歷。

8、支持的操作

由於ArrayList在內部由數組支持,因此它公開了Array可能執行的操作,但是鑑於其動態特性,它還沒有添加Array無法執行的操作,例如,您可以將元素存儲在array和ArrayList中,但是隻有ArrayList允許您刪除元素。雖然您可以通過分配null使用數組來模擬到相應的索引,除非將多箇中間該索引上方的所有元素都向下移動一級,否則它不會像刪除。

ArrayList和Array都提供了檢索元素的方法,例如ArrayList的get()方法使用索引從數組中獲取元素,例如,Array[0]將返回第一個元素
。ArrayList還提供了清除和重用的操作,例如clear()和removeAll(),Array不提供該操作,但是您可以循環遍歷Array併爲每個索引分配null以模擬它。

9、size()與length

數組僅提供一個length屬性,該屬性告訴您數組中的插槽數,即可以存儲多少個元素,它不提供任何方法來找出已填充的元素數和多少個插槽爲空,即元素。儘管ArrayList確實提供了size()方法,該方法告訴給定時間點存儲在ArrayList中的對象數量。size()始終與length不同,這也是ArrayList的容量。

10、維度

數組和數組列表之間的另一個顯着區別是,數組可以是多維的,例如,您可以具有二維數組或三維數組,這可以表示矩陣和2D地形的非常特殊的數據結構。

Array和ArrayList之間的相似性

到目前爲止,您已經看到了ArrayList和副本之間的區別,現在讓我們集中討論一些相似之處。由於ArrayList在內部使用數組,因此必然有很多相似之處,如下所示:

1、數據結構

兩者都允許您將對象存儲在Java中,並且彼此都是基於索引的數據結構,可提供O(1)性能來檢索元素,但是,如果對進行了排序和使用了二進制搜索算法,則沒有索引的搜索仍然是LOG(N) 。

2、順序

Array和AArrayList都保持將元素添加到其中的順序。

3、搜索

您可以使用索引搜索元素,即O(1),否則,如果未對片段進行排序,則可以使用線性搜索,這大約需要O(n)的時間,也可以在對進行進行排序後使用二進制搜索Java,這是排序+ O(logN)。

4、空值

這兩個數組和ArrayList允許空值,但請記住只有對象數組允許其存儲爲空,原始類型不能爲空,原始類型爲使用默認值。例如:int類型的0與 boolean類型的false 。

5、複製

array和ArrayList都允許複製。

6、性能

ArrayList模擬數組的性能,例如,如果您知道索引,則可以進行O(1)訪問,但是它具有額外的內存開銷,因爲它是一個對象,並且還擁有其他數據以自動調整ArrayList的大小。

7、從零開始的索引

array和ArrayList都有從零開始的索引,即第一個元素從第零個索引開始。

這就是Java中數組與ArrayList之間真正的區別的全部。您應該記住的最重要的區別是,Array本質上是靜態的,即創建後就無法更改其大小,但是ArrayList是動態數組,如果ArrayList中的元素數大於其閾值,則可以調整自身大小。基於這種差異,如果預先知道大小並確定它不會改變,則應該使用數組作爲數據結構來存儲對象;如果不確定,則只需使用ArrayList。


“不積跬步,無以至千里”,希望未來的你能:有夢爲馬 隨處可棲!加油,少年!

關注公衆號:「Java 知己」,每天更新Java知識哦,期待你的到來!

  • 發送「Group」,與 10 萬程序員一起進步。
  • 發送「面試」,領取BATJ面試資料、面試視頻攻略。
  • 發送「玩轉算法」,領取《玩轉算法》系列視頻教程。
  • 千萬不要發送「1024」…

在這裏插入圖片描述

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