Java中Array、List、ArrayList的區(qū)別及說(shuō)明
Array、List、ArrayList區(qū)別
Array
Array(數(shù)組)是基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的。
Array獲取數(shù)據(jù)的時(shí)間復(fù)雜度是O(1),但是要?jiǎng)h除數(shù)據(jù)卻是開(kāi)銷很大,因?yàn)檫@需要重排數(shù)組中的所有數(shù)據(jù)。
List
List—是一個(gè)有序的集合,可以包含重復(fù)的元素,提供了按索引訪問(wèn)的方式,它繼承Collection。
List是一個(gè)接口,不能寫(xiě)成如下:
List<Integer> list = new List<Integer>();//錯(cuò)誤
List有兩個(gè)重要的實(shí)現(xiàn)類:ArrayList和LinkedList
ArrayList
繼承關(guān)系

可以看作是能夠自動(dòng)增長(zhǎng)容量的數(shù)組;
利用ArrayList的toArray返回一個(gè)數(shù)組;
Arrays.asList返回一個(gè)列表;
- ArrayList底層采用數(shù)組實(shí)現(xiàn),當(dāng)使用不帶參數(shù)的構(gòu)造方法生成ArrayList對(duì)象時(shí),實(shí)際上會(huì)在底層生成一個(gè)長(zhǎng)度為10的Object類型的數(shù)組。
- 如果增加的元素個(gè)數(shù)超過(guò)10個(gè),那么ArrayList底層會(huì)生成一個(gè)新的數(shù)組,長(zhǎng)度為原數(shù)組的1.5倍+1,然后將原數(shù)組的內(nèi)容復(fù)制到新數(shù)組中,并且后續(xù)增加的內(nèi)容都會(huì)放到新的數(shù)組當(dāng)中,當(dāng)新的數(shù)組無(wú)法容納增加的元素時(shí),重讀該過(guò)程。
- 對(duì)于ArrayList元素的刪除操作,需要將被刪除元素的后續(xù)元素向前移動(dòng),代價(jià)比較大。
- 集合當(dāng)中只能放置對(duì)象的引用,無(wú)法放置原生數(shù)據(jù)類型,我們必須使用原生數(shù)據(jù)的包裝類才能加入到集合當(dāng)中。
- 集合當(dāng)中都是Object類型,因此取出來(lái)的也是Object類型,那么必須要使用強(qiáng)制類型轉(zhuǎn)化將其轉(zhuǎn)換成真正的類型(放置進(jìn)去的類型)。
LinkedList
是一個(gè)雙鏈表,在添加和刪除元素時(shí)具有比ArrayList更好的性能.但在get與set方面弱于ArrayList.當(dāng)然,這些對(duì)比都是指數(shù)據(jù)量很大或者操作很頻繁。
- 相對(duì)于ArrayList,LinkedList插入是更快的。因?yàn)長(zhǎng)inkedList不像ArrayList一樣,不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿的時(shí)候要將所有的數(shù)據(jù)重新裝入一個(gè)新的數(shù)組,這是ArrayList最壞的一種情況,時(shí)間復(fù)雜度是O(n),而LinkedList中
- 插入或刪除的時(shí)間復(fù)雜度僅為O(1)。ArrayList在插入數(shù)據(jù)時(shí)還需要更新索引(除了插入數(shù)組的尾部)。
- 類似于插入數(shù)據(jù),刪除數(shù)據(jù)時(shí),LinkedList也優(yōu)于ArrayList。
- LinkedList需要更多的內(nèi)存,因?yàn)锳rrayList的每個(gè)索引的位置是實(shí)際的數(shù)據(jù),而LinkedList中的每個(gè)節(jié)點(diǎn)中存儲(chǔ)的是實(shí)際的數(shù)據(jù)和前后節(jié)點(diǎn)的位置。
Array和ArrayList有何區(qū)別?什么時(shí)候更適合用Array?
Array 可以容納基本類型和對(duì)象,而 ArrayList 只能容納對(duì)象。
Array 是指定大小的,而 ArrayList 大小是固定的。
Array 沒(méi)有提供 ArrayList 那么多功能,比如 addAll 、 removeAll 和 iterator 等。盡管 ArrayList 明顯是更好的選擇,但也有些時(shí)候 Array 比較好用。
1 、如果列表的大小已經(jīng)指定,大部分情況下是存儲(chǔ)和遍歷它們。
2 、對(duì)于遍歷基本數(shù)據(jù)類型,盡管 Collections 使用自動(dòng)裝箱來(lái)減輕編碼任務(wù),在指定大小的基本類型的列表上工作也會(huì)變得很慢。
3 、如果你要使用多維數(shù)組,使用 [][] 比 List<List<>> 更容易。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決若依pageHelper在動(dòng)態(tài)切換數(shù)據(jù)源問(wèn)題
這篇文章主要介紹了解決pageHelper在動(dòng)態(tài)切換數(shù)據(jù)源問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Spring MVC中使用Google kaptcha驗(yàn)證碼的方法詳解
kaptcha 是一個(gè)非常實(shí)用的驗(yàn)證碼生成工具。有了它,你可以生成各種樣式的驗(yàn)證碼,因?yàn)樗强膳渲玫?,下面這篇文章主要給大家介紹了關(guān)于Spring MVC中使用Google kaptcha驗(yàn)證碼的方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-10-10
SpringBoot全局異常捕獲處理實(shí)現(xiàn)方案
這篇文章主要詳細(xì)介紹了SpringBoot全局異常捕獲處理實(shí)現(xiàn)方案,文章通過(guò)代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下2024-02-02
IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活)
這篇文章主要介紹了IntelliJ IDEA 2020常用配置設(shè)置大全(方便干活),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
mybatis返回map類型數(shù)據(jù)空值字段不顯示的解決方案
這篇文章主要介紹了mybatis返回map類型數(shù)據(jù)空值字段不顯示的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
我用java實(shí)現(xiàn)了王者榮耀的皮膚和英雄技能
上篇文章主要實(shí)現(xiàn)了創(chuàng)建英雄,創(chuàng)建野怪,創(chuàng)建裝備.并且實(shí)現(xiàn)了簡(jiǎn)單的刷怪,購(gòu)買(mǎi)裝備等.本篇文章我優(yōu)化了我的操作界面,并且實(shí)現(xiàn)了英雄技能,英雄皮膚等,需要的朋友可以參考下2021-05-05
Java線程池中execute()和submit()兩個(gè)方法的區(qū)別(源碼&實(shí)戰(zhàn)全解析)
線程池是現(xiàn)代多線程編程中的重要工具,它能顯著提升任務(wù)處理效率并優(yōu)化系統(tǒng)資源,這篇文章主要介紹了Java線程池中execute()和submit()兩個(gè)方法區(qū)別的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2026-03-03
Java實(shí)現(xiàn)UDP通信過(guò)程實(shí)例分析【服務(wù)器端與客戶端】
這篇文章主要介紹了Java實(shí)現(xiàn)UDP通信過(guò)程,結(jié)合實(shí)例形式分析了java實(shí)現(xiàn)UDP服務(wù)器端與客戶端相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下2020-05-05

