Java中Array和ArrayList之间的9个区别
array和ArrayList都是Java中兩個重要的數據結構,在Java程序中經常使用。 即使ArrayList在內部由數組支持,了解Java中的數組和ArrayList之間的差異對于成為一名優秀的Java開發人員也至關重要。 如果您知道相似點和不同點,則可以明智地決定何時在AraryList上使用數組,反之亦然。
在本文中,我將幫助您了解不同之處。 如果您來自C或C ++背景,那么您已經知道數組是編程世界中最有用的數據結構之一。 它為基于索引的搜索提供O(1)性能,并且是存儲數據的基本方式之一。
另一方面, ArrayList是Java Collection框架中的一個類,它是作為動態數組引入的。 由于數組本質上是靜態的,即一旦創建后就無法更改數組的大小,因此,如果需要一個可以調整自身大小的數組,則應使用ArrayList。 這是數組和ArrayList之間的根本區別。
Java中的Array vs ArrayList
最好在某些點上比較兩件事,這將使差異易于理解。 因此,讓我們看看可以在Java中將數組與ArrayList進行比較的幾點
1.實施
數組是本機編程組件或數據結構,但ArrayList是Java Collections框架(API)中的類。 實際上, ArrayList是使用array在內部實現的 。 由于ArrayList是一個類,因此它擁有一個類的所有屬性,例如,您可以創建對象和調用方法,但是即使數組是Java中的對象,它也不提供任何方法。 它只是公開一個length屬性來為您提供數組的長度,它是恒定的。
2.表現
由于ArrayList基于數組,因此您將假定它提供與數組相同的性能。 在某種程度上確實如此,但是由于ArrayList提供了額外的功能,因此ArrayList和數組之間的性能存在一些差異,主要是在內存使用和CPU時間方面。
對于基于索引的訪問,ArrayList和array都提供O(1)性能,但是如果添加新元素會觸發調整大小,則add在ArrayList中可以為O(logN) ,因為它涉及在后臺創建新數組并從舊數組中復制元素到新的數組 。 ArrayList的內存需求還不止一個用于存儲相同數量對象的數組,例如,由于ArrayList和wrapper類的對象元數據開銷較大,因此int[]會比ArrayList占用更少的內存來存儲20個int變量。
3.類型安全
ArrayList是類型安全的,因為它支持泛型,泛型允許編譯器檢查ArrayList中存儲的所有對象的類型是否正確。 另一方面, 數組不支持Generics 。 這意味著無法進行編譯時檢查,但是如果您嘗試將不正確的對象存儲到數組中(例如,將String存儲到int數組中),則array通過拋出ArrayStoreException來提供運行時類型檢查。
4.靈活性
靈活性是分隔array和ArrayList的最重要的事情。 簡而言之,ArrayList比普通的本地數組更靈活,因為它是動態的。 它可以在需要時自行增長,而本機陣列則無法實現。 ArrayList還允許您刪除本機數組無法實現的元素。 通過刪除,我們的意思不僅是將null分配給相應的索引,還意味著將其余元素向下復制一個索引,而ArrayList會自動為您執行此操作。 您可以在我的文章clear()和removeAll()之間的區別中了解有關從ArayList刪除對象的更多信息。
5.原語
如果您首先開始使用ArrayList,那么您將意識到您無法在ArrayList上存儲基元。 這是array和ArrayList之間的主要區別,因為array允許存儲基元和object 。 例如,int []數字有效,但int的ArrayList無效。 您如何處理這個問題?
假設您想將int原語存儲到ArrayList中,那又如何呢? 好了,您可以使用包裝器類。 這是在Java中引入包裝器類的原因之一。 因此,如果您只想將int 2存儲到ArrayList中,其余的操作將由自動裝箱完成。 順便說一句,由于自動裝箱 ,這種差異從Java 5開始并不明顯,因為您會看到ArrayList.add(21)完全有效并且可以正常工作。
6.泛型
ArrayList和數組之間的另一個重要區別是,前者支持Generic,而后者不支持Generic。 由于數組是協變類型的,因此可以將泛型與它們一起使用。 這意味著編譯器不可能在編譯時檢查數組的類型安全性,但他們可以驗證Array的類型安全性。 那么在用Java編寫類型安全的類時如何處理這個問題呢? 好了,您可以使用有效Java中顯示的技術,在其中可以聲明一個像E[]這樣的數組,然后使用類型轉換。
7.迭代
ArrayList提供了更多的迭代方式,即與數組相比一一訪問所有元素。 您只能使用循環,例如for,while,for循環的增強和do-while來遍歷數組,但也可以使用Iterator和ListIterator類來遍歷ArrayList。 請參閱此處以了解在Java中迭代ArrayList的不同方法。
8.支持的運營
由于ArrayList在內部由數組支持,因此它公開了數組可能執行的操作,但鑒于其動態性質,它還添加了本機數組無法執行的操作,例如,您可以在array和ArrayList中存儲元素,但只有ArrayList允許您刪除一個元素。 盡管您可以通過將null分配給相應的索引來模擬數組,但是除非您也將數組中該索引上方的所有元素都向下移動一級,否則它不會像remove。
ArrayList和array都提供了檢索元素的方法,例如ArrayList的get()方法使用索引從數組中獲取元素,例如, version[0]將返回第一個元素。
ArrayList還提供清除和重用的操作,例如clear()和removeAll() ,數組不提供該操作,但是您可以循環訪問Array并為每個索引分配null來模擬它。
9. Size()與長度
數組僅提供一個length屬性,該屬性告訴您數組中的插槽數,即可以存儲多少個元素,它不提供任何方法來找出已填充的元素數和多少個插槽為空,即元素。 盡管ArrayList確實提供了size()方法,該方法告訴給定時間點存儲在ArrayList中的對象數量。 size()始終與長度不同,這也是ArrayList的容量。 如果您想了解更多信息,建議您閱讀ArrayList文章中的size()和length之間的區別 。
10.尺寸
數組和ArrayList之間的另一個顯著區別是,數組可以是多維的,例如,您可以具有二維數組或三維數組,這使其成為表示矩陣和2D地形的非常特殊的數據結構。 另一方面,ArrayList不允許您指定尺寸。 請參閱本教程,以了解有關如何在Java中使用多維數組的更多信息。
這是一張很好的幻燈片,突出顯示了Java中Array和ArrayList之間的所有重要區別:
Array和ArrayList之間的相似之處
到目前為止,您已經看到了ArrayList和數組之間的區別,現在讓我們集中討論一些相似之處。 由于ArrayList在內部使用數組,因此必然有很多相似之處,如下所示:
1.數據結構
兩者都允許您使用Java存儲對象,并且兩者都是基于索引的數據結構,可提供O(1)性能來檢索元素,但是如果對數組進行了排序并且使用了二進制搜索,則沒有索引的搜索仍然是log(N) 算法 。
2.訂購
array和ArrayList都保持將元素添加到其中的順序。
3.搜索
您可以使用索引搜索元素,即O(1)否則,如果數組未排序,則可以使用線性搜索,這大約需要O(n)時間,也可以在Java中對數組進行排序后使用二進制搜索,這正在排序+ O(logN)。
4.空值
array和ArrayList都允許空值,但請記住只有對象數組才允許空基元數組,它們不存儲基元類型的默認值,例如int為零,布爾false 。
5.重復
array和ArrayList都允許重復。 這也是編寫程序以從數組中找出重復項的常見的基于數組的編碼問題之一 。
6.表現
ArrayList模擬數組的性能,例如,如果您知道索引,則可以進行O(1)訪問,但它具有額外的內存開銷,因為它是一個對象,并且還擁有其他數據以自動調整ArrayList的大小。
7.零基索引
array和ArrayList都具有從零開始的索引,即第一個元素從第零個索引開始。
您應該記住的最重要的區別是,數組本質上是靜態的,即創建后就無法更改其大小,但是ArrayList是動態數組,如果ArrayList中的元素數大于調整大小閾值,則可以調整自身大小。 基于這種差異,如果事先知道大小并確定它不會改變,則應該使用數組作為數據結構來存儲對象;如果不確定,則只需使用ArrayList。
翻譯自: https://www.javacodegeeks.com/2016/01/9-differences-between-array-and-arraylist-in-java.html
總結
以上是生活随笔為你收集整理的Java中Array和ArrayList之间的9个区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: k330电脑主主板接线图(a320m-k
- 下一篇: 滁州祥生十里地址(滁州祥生十里备案价)