Friday, September 3, 2010

java陣列


給未來的裕翔

要宣告一個陣列

int[] a


int a[]

皆可, 不過老師建議用上面那個

因為以method來看

如果現在有個method要回傳整數陣列

public int[] doSomething() {...}

那個中括號很明顯就不能跟int拆開

所以保持一致比較好

另外

如果現在這樣宣告, int a[], b

那個a[]是參考型別, 因為陣列是一個特殊物件

(element可以說是它的attribute)

而b是基本型別

接著

int[] a = new int [-5], 編譯ok, 執行不ok

int[] a = new int [0], 編譯ok, 執行ok

int[] a = new int [3.5], 編譯就不ok了^^

如果現在有以下宣告

int size = 5
int[] ia = new int [size]

在c編譯不會過喔, size必須是constant才可以

理由是c的stack是固定大小的

陣列大小必須在編譯時期就知道

而java有heap memory, 所以剛那兩行宣告是會過的

陣列大小可為0, 那陣列上限呢?

跟JVM預設的heap mem有關, 64MB

可改大小, 不過還是有其上限

就是int的上限, 21億多

那是因為陣列的index是整數

另外, int[] x如果被初始化

它的值是null

從這裡也可以發現, int[] x比起int x[]更容易判斷它是參考型別

在main方法裡

如果

int size

int[] a = new int[size]

會錯, 原因跟陣列無關, 而是區域變數使用前沒給值

但如果上面那兩行放在class裡面就ok

因為建立物件的同時size會被給0

(中場閒聊: SCJP很少考單一觀念)

至於陣列的初始化

int[] ia = { 1, 3, 5 } 這ok

int[] ia;
ia = { 1, 3, 5 } 這不ok

int[] ia;
ia = new int[] { 1, 3, 5 } 這就ok

再來, 陣列物件有個attribute叫length

它是final, 無法修改

如果要複製陣列

可以用System.arraycopy()

需要五個參數, 分別是

source, sourceIndex, target, targetIndex, count

只處理一維, 事實上java也只有一維

要複製元素的話盡量使用這個方法, 不要自己寫for

因為這方法使用原生方法, 利用OS來達成

所以會比自己寫for快很多

再來是方法的overloading

如果一個類別裡面同時有

public m( int... a )和public m( int[] a )

會錯, 因為int...其實就是陣列

把其中一個換成public m(int a)就可以過編譯

但是, 如果我現在是

public m( int... a )
public m( int a )

雖然可以編譯過

由於int... a也可以接收一個變數的呼叫

那到時怎知哪個會被呼叫

答案是public m( int a )

因為它最符合

基於它(...)給的幫助不大, 又會造成混淆

老師對它的評價: 爛死了!!!

^^

(順便提一下, main的String[]換成String...也是ok的)

(若只有String則不ok)

現在談一下命令列

如果我java MyApp a b c

args就是a, b, c三個字串

如果現在只有java MyApps

那args還會建立嗎?

會! 個數為0的陣列

這很重要嗎?

當然, 要成為master, 至少就要知道的比別人多^^

所以上例的args就算沒element, 它也不會是null

No comments:

Post a Comment