讀古今文學網 > 編寫高質量代碼:改善Java程序的151個建議 > 建議61:若有必要,使用變長數組 >

建議61:若有必要,使用變長數組

Java中的數組是定長的,一旦經過初始化聲明就不可改變長度,這在實際使用中非常不方便,比如要對班級學生的信息進行統計,因為我們不知道一個班級會有多少學生(隨時都可能會有學生入學、退學或轉學),所以需要有一個足夠大的數組來容納所有的學生,但問題是多大才算足夠大?10年前一台台式機64MB的內存已經很牛了,現在要是沒有2GB的內存你都不好意思跟別人交流計算機的配置,所以呀,這個足夠大是相對於當時的場景而言的。隨著環境的變化,「足夠大」也可能會轉變成「足夠小」,然後就會出現超出數組最大容量的情況,那該如何解決呢?事實上,可以通過對數組擴容「婉轉」地解決該問題,代碼如下:


public static<T>TexpandCapacity(Tdatas, int newLen){

//不能是負值

newLen=newLen<0?0:newLen;

//生成一個新數組,並拷貝原值

return Arrays.copyOf(datas, newLen);

}


上述代碼中採用的是Arrays數組工具類的copyOf方法,產生了一個newLen長度的新數組,並把原有的值拷貝了進去,之後就可以對超長的元素進行賦值了(依據類型的不同分別賦值為0、false或null),使用方法如下:


public static void main(Stringargs){

//一個班級最多容量60個學生

Stuclasses=new Stu[60];

/*classes初始化……*/

//偶爾一個班級可以容納80人,數組加長

classes=expandCapacity(classes,80);

/*重新初始化超過限額的20人……*/

}


通過這樣的處理方式,曲折地解決了數組的變長問題。其實,集合的長度自動維護功能的原理與此類似。在實際開發中,如果確實需要變長的數據集,數組也是在考慮範圍之內的,不能因固定長度而將其否定之。