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