在java中有很多方式來(lái)存儲(chǔ)一系列數(shù)據(jù),而且在操作上面比數(shù)組方便的多?但為什么我們還需要使用數(shù)組,而不是替代它呢?數(shù)組與其他種類(lèi)的容器之間的區(qū)別有三個(gè)方面:效率、類(lèi)型和保存基本類(lèi)型的能力。在java中,數(shù)組是一種效率最高的存儲(chǔ)和隨機(jī)訪問(wèn)對(duì)象引用序列的方式。
在項(xiàng)目設(shè)計(jì)中數(shù)組使用的越來(lái)越少了,而且它確實(shí)是沒(méi)有List、Set這些集合使用方便,但是在某些方面數(shù)組還是存在一些優(yōu)勢(shì)的,例如:速度,而且集合類(lèi)的底層也都是通過(guò)數(shù)組來(lái)實(shí)現(xiàn)的。
[java] view plain copy下面利用數(shù)組和list來(lái)做一些操作比較。
一、求和
[java] view%20plain copy這段代碼對(duì)我們有用的地方就在于if語(yǔ)句后面。它的思路是將原始數(shù)組拷貝到新數(shù)組中,新數(shù)組是原始數(shù)組長(zhǎng)度的1.5倍。所以模擬的數(shù)組擴(kuò)容代碼如下:
[java] view%20plain copy從結(jié)果中發(fā)現(xiàn),persons1中的值也發(fā)生了改變,這是典型的淺拷貝問(wèn)題。所以通過(guò)Arrays.copyOf()方法產(chǎn)生的數(shù)組是一個(gè)淺拷貝。同時(shí)數(shù)組的clone()方法也是,集合的clone()方法也是,所以我們?cè)谑褂每截惙椒ǖ耐瑫r(shí)一定要注意淺拷貝這問(wèn)題。
有關(guān)于深淺拷貝的博文,參考:
我們經(jīng)常需要使用到Arrays這個(gè)工具的asList()方法將其轉(zhuǎn)換成列表。方便是方便,但是有時(shí)候會(huì)出現(xiàn)莫名其妙的問(wèn)題。如下:
[java] view%20plain copy 結(jié)果是1,是的你沒(méi)有看錯(cuò),%20結(jié)果就是1。但是為什么會(huì)是1而不是5呢?先看asList()的 注意這個(gè)參數(shù):T…a,這個(gè)參數(shù)是一個(gè)泛型的變長(zhǎng)參數(shù),我們知道基本數(shù)據(jù)類(lèi)型是不可能泛型化的,也是就說(shuō)8個(gè)基本數(shù)據(jù)類(lèi)型是不可作為泛型參數(shù)的,但是為什么編譯器沒(méi)有報(bào)錯(cuò)呢?這是因?yàn)樵趈ava中,數(shù)組會(huì)當(dāng)做一個(gè)對(duì)象來(lái)處理,它是可以泛型的,所以我們的程序是把一個(gè)int型的數(shù)組作為了T的類(lèi)型,所以在轉(zhuǎn)換之后List中就只會(huì)存在一個(gè)類(lèi)型為int數(shù)組的元素了。所以我們這樣的程序System.out.println(datas.equals(list.get(0)));輸出結(jié)果肯定是true。當(dāng)然如果將int改為Integer,則長(zhǎng)度就會(huì)變成5了。 我們?cè)诳聪旅娉绦颍?/p> 這個(gè)程序非常簡(jiǎn)單,就是講一個(gè)數(shù)組轉(zhuǎn)換成list,然后改變集合中值,但是運(yùn)行呢?public static <T> List<T> asList(T... a) { return new ArrayList<T>(a); }
enum Week{Sum,Mon,Tue,Web,Thu,Fri,Sat} public static void main(String[] args) { Week[] weeks = {Week.Sum,Week.Mon,Week.Tue,Week.Web,Week.Thu,Week.Fri}; List<Week> list = Arrays.asList(weeks); list.add(Week.Sat); }
Exception in thread "main" java.lang.UnsupportedOperationException at java.util.AbstractList.add(AbstractList.java:131) at java.util.AbstractList.add(AbstractList.java:91) at com.array.Test.main(Test.java:18)
編譯沒(méi)錯(cuò),但是運(yùn)行竟然出現(xiàn)了異常錯(cuò)誤!UnsupportedOperationException%20,當(dāng)不支持請(qǐng)求的操作時(shí),就會(huì)拋出該異常。從某種程度上來(lái)說(shuō)就是不支持add方法,我們知道這是不可能的!什么原因引起這個(gè)異常呢?先看asList()的源代碼:
[java] view%20plain copy這里是直接返回一個(gè)ArrayList對(duì)象返回,但是注意這個(gè)ArrayList并不是java.util.ArrayList,而是Arrays工具類(lèi)的一個(gè)內(nèi)之類(lèi):
[java] view%20plain copy但是這個(gè)內(nèi)部類(lèi)并沒(méi)有提供add()方法,那么查看父類(lèi):
[java] view%20plain copy這里父類(lèi)僅僅只是提供了方法,方法的具體實(shí)現(xiàn)卻沒(méi)有,所以具體的實(shí)現(xiàn)需要子類(lèi)自己來(lái)提供,但是非常遺憾
這個(gè)內(nèi)部類(lèi)ArrayList并沒(méi)有提高add的實(shí)現(xiàn)方法。在ArrayList中,它主要提供了如下幾個(gè)方法:
1、size:元素?cái)?shù)量
2、toArray:轉(zhuǎn)換為數(shù)組,實(shí)現(xiàn)了數(shù)組的淺拷貝。
3、get:獲得指定元素。
4、contains:是否包含某元素。
所以綜上所述,asList返回的是一個(gè)長(zhǎng)度不可變的列表。數(shù)組是多長(zhǎng),轉(zhuǎn)換成的列表是多長(zhǎng),我們是無(wú)法通過(guò)add、remove來(lái)增加或者減少其長(zhǎng)度的。
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注