Java – Array Initialization

來源:互聯網
上載者:User

數組:相同類型的、用一個標識符名稱封裝到一起的,一個對象序列or基本類型資料序列。數組定義方式:int[] a1; 編譯器不允許指定上述代碼中數組的大小。這就又把我們帶回到有關“引用”的問題上。現在擁有的只是對數組的一個引用,而且也沒給數組分配任何空間。為了給數組建立相應的儲存空間,必須寫初始設定式。 **對於數組,初始化動作可以出現在代碼的任何地方,但也可以使用一種特殊的初始設定式,它必須在建立數組的地方出現。這種特殊的初始化是由一對花括弧括起來的值組成的。在這種情況下,儲存空間的分配(等價於使用new)將由編譯器負責。例如: int[] a1 = {1, 2, 3, 4, 5}; 那麼,為什麼還要在沒有數組的時候定義一個數組引用(int[] a1;)呢?在Java中可以將一個數組賦值給另一個數組,所以可以這樣:a2 = a1; 其實真正做的只是複製了一個引用。

/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;public class Arrays {public static void main(String[] args) {int[] a1 = {1, 2, 3, 4, 5};int[] a2 = a1;for (int i = 0; i < a2.length; i++) { a2[i]++; }for (int i = 0; i < a1.length; i++) { System.out.println(a1[i]); }}}

**如果在編寫程式時,並不能確定在數組裡需要多少個元素,那麼該怎麼辦呢?可以直接用new在數組裡建立元素。儘管建立的是基本類型數組,new依然可以工作(不能用new建立單個的基本類型資料)。

/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;import java.util.Random;public class ArrayNew {public static void main(String[] args) {Random rand = new Random();int[] a1;a1 = new int[rand.nextInt(5)];System.out.println("a1.length = " + a1.length);for (int i = 0; i < a1.length; i++) { a1[i] = rand.nextInt(100);System.out.println("a1[" + i + "] = " + a1[i]);}}} 
當然,數組也可以在定義的同時進行初始化:int[] a = new int[rand.nextInt(20)]; 如果可能的話,應該盡量這麼做。**如果數組裡的元素不是基礎資料型別 (Elementary Data Type),那麼必須使用new。這裡再次遇到引用問題,因為所建立的數組裡每個元素都是一個引用。
/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;import java.util.Random;public class ArrayClassObj {static Random rand = new Random();public static void main(String[] args) {Integer[] a1 = new Integer[rand.nextInt(10)];System.out.println("a1.length = " + a1.length);for (int i = 0; i < a1.length; i++) {a1[i] = new Integer(rand.nextInt(1000));System.out.println("a1[" + i + "] = " + a1[i]);}}} 

這裡,即便使用new建立數組之後:Integer[] a1 = new Integer[rand.nextInt(10)]; 它還只是一個引用數組,並且直到通過建立新的Integer對象,並把對象賦值給引用,初始化進程才算結束:a1[i] = new Integer(rand.nextInt(1000)); 也可以用花括弧括起來的列表來初始化對象數組。有兩種形式:

/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;public class ArrayInit {public static void main(String[] args) {/** * 隱式建立數組對象  */Integer[] a = { new Integer(1), new Integer(2), new Integer(3), };/** * 顯式建立數組對象  */Integer[] b = new Integer[] { new Integer(1), new Integer(2), new Integer(3) };}} 
第一種形式有時很有用,但由於數組的大小在編譯時間就決定了,所以很受限制。初始化列表的最後一個逗號是可選的(這一特性使維護長列表變得更容易)。第二種形式提供了一種方便的文法來建立對象並調用方法,這可以應用於參數個數或類型未知的場合。由於所有的類都直接或間接繼承於Object類,所以可以建立以Object數組為參數的方法,並像下面這樣調用:
/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;class A { int i; }public class VarArgs {static void print(Object[] obj) {for (int i = 0; i < obj.length; i++) System.out.println(obj[i]);}public static void main(String[] args) {print(new Object[] { new Integer(54), new VarArgs(), new Float(4.3), new Double(7.55) });print(new Object[] { "one", "two", "three", "four" });print(new Object[] { new A(), new A(), new A(), });}} 

可以看到print()方法使用Object數組作為參數,然後遍曆數組,列印每個對象。標準Java庫中的類能輸出有意義的內容,**但自己建立的類(A和VarArgs)的對象,列印出的內容只是類的名稱以及後面緊跟著的一個@符號,和一個十六進位數字(這個數字代表對象的堆地址)。於是,預設行為(如果沒有定義toString()方法的話)就是列印類的名字和對象的地址。

多維陣列:

/** * Title:  * Description:  * Company: Augmentum Inc<br> * Copyright: 2008 (c) Thinking in Java<br> * @author: Forest He * @version: 1.0 */package com.augmentum.foresthe;import java.util.Random;public class MultiDimArray {static Random rand = new Random();public static void main(String[] args) {/** * 2-D array with fixed length, 花括弧標出了數組中的每個向量 */int[][] a1 = { {1, 2, 3}, {4, 5, 6}, };for (int i = 0; i < a1.length; i++) for (int j = 0; j < a1[i].length; j++) System.out.println("a1[" + i + "][" + j + "] = " + a1[i][j]);/** * 3-D array with fixed length, 數組分配是一次完成的 */int[][][] a2 = new int[2][2][4];for (int i = 0; i < a2.length; i++)for (int j = 0; j < a2[i].length; j++)for (int k = 0; k < a2[i][j].length; k++) System.out.println("a2[" + i + "][" + j + "][" + k + "] = " + a2[i][j][k]);/** * 3-D array with varied-length vectors, 數組中用以構成矩陣的向量可以有任意的長度 * 不規則形狀的數組 */int[][][] a31 = new int[rand.nextInt(5)][][];for (int i = 0; i < a31.length; i++) {a31[i] = new int[rand.nextInt(4)][];for (int j = 0; j < a31[i].length; j++) a31[i][j] = new int[rand.nextInt(3)];}for (int i = 0; i < a31.length; i++) for (int j = 0; j < a31[i].length; j++) for (int k = 0; k < a31[i][j].length; k++) System.out.println("a31[" + i + "][" + j + "][" + k + "] = " + a31[i][j][k]);/** * 3-D array with varied-length vectors * 矩形形狀的數組 */int[][][] a32 = new int[rand.nextInt(5)][rand.nextInt(4)][rand.nextInt(3)];for (int i = 0; i < a32.length; i++) for (int j = 0; j < a32[i].length; j++) for (int k = 0; k < a32[i][j].length; k++) System.out.println("a32[" + i + "][" + j + "][" + k + "] = " + a32[i][j][k]);/** * Array of nonprimitive objects 1 */Integer[][] a4 = { { new Integer(1), new Integer(2), },{ new Integer(3), new Integer(4), },{ new Integer(5), new Integer(6), },};for (int i = 0; i < a4.length; i++) for (int j = 0; j < a4[i].length; j++) System.out.println("a4[" + i + "][" + j + "] = " + a4[i][j]);/** * Array of nonprimitive objects 2 */Integer[][] a5;a5 = new Integer[3][];for (int i = 0; i < a5.length; i++) {a5[i] = new Integer[3];for (int j = 0; j < a5[i].length; j++) a5[i][j] = new Integer(i * j);}for (int i = 0; i < a5.length; i++) for (int j = 0; j < a5[i].length; j++) System.out.println("a5[" + i + "][" + j + "] = " + a5[i][j]);}} 
關於數組的新東西:所有數組(無論它們的元素是對象還是基本類型)都有一個固有成員,可以通過它獲知數組內包含了多少個元素,但不能對其修改。這個成員就是length。與C和C++類似,Java數組記數也是從第0個元素開始,所以能使用的最大下標數是“length - 1”。要是超出這個邊界,C和C++會“默默”地接受,並允許你訪問所有記憶體,許多聲名狼藉的程式錯誤由此而來。Java則能保護你免受這一問題的困擾,一旦訪問下標過界,就會出現執行階段錯誤(即異常)。當然,每次訪問數組的時候都要檢查邊界的做法在時間和代碼上都是需要開銷的,但是無法禁用這個功能。這意味著如果數組訪問發生在一些關鍵節點上,它們有可能會成為導致程式效率低下的原因之一。但是基於“網際網路的安全以及提高程式員生產力”的理由,Java的設計者認為這種權衡是值得的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.