給未來的裕翔
要宣告一個陣列
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