int数组初始化_Java中到底有没有多维数组
Java 中沒有多維數組的概念,從數組底層的運行機制上來看 Java 沒有多維數組,但是 Java 提供了支持多維數組的語法,可以實現多維數組的功能。
Java 語言里的數組類型是引用類型,因此數組變量其實是一個引用,這個引用指向真實的數組內存。數組元素的類型也可以是引用,如果數組元素的引用再次指向真實的數組內存,這種情形看上去很像多維數組。
定義數組類型的語法type[] arrName;是典型的一維數組的定義語法,其中 type 是數組元素的類型。如果希望數組元素也是一個引用,而且是指向 int 數組的引用,則可以把 type 具體成 int[](前面已經指出,int[] 就是一種類型,int[] 類型的用法與普通類型并無任何區別),那么上面定義數組的語法就是int[][] arrName。
如果把 int 這個類型擴大到 Java 的所有類型(不包括數組類型),則出現了定義二維數組的語法:
type[][] arrName;Java 語言采用上面的語法格式來定義二維數組,但它的實質還是一維數組,只是其數組元素也是引用,數組元素里保存的引用指向一維數組。
接著對這個“二維數組”執行初始化,同樣可以把這個數組當成一維數組來初始化,把這個“二維數組”當成一個一維數組,其元素的類型是 type[] 類型,則可以采用如下語法進行初始化:
arrName = new type[length][]上面的初始化語法相當于初始化了一個一維數組,這一維數組的長度是 length。同樣,因為這個一維數組的數組元素是引用類型(數組類型)的,所以系統為每個數組元素都分配初始值:null。
這個二維數組實際上完全可以當成一維數組使用:使用new type[length]初始化一維數組后,相當于定義了 length 個 type 類型的變量。類似的,使用new type[length][]
初始化這個數組后,相當于定義了 length 個 type[] 類型的變量。當然,這些 type[] 類型的變量都是數組類型,因此必須再次初始化這些數組。
下面程序示范了如何把二維數組當成一維數組處理。
public class TwoDimensionTest {public static void main(String[] args) {// 定義一個二維數組int[][] a;// 把a當成一維數組進行初始化,初始化a是一個長度為4的數組// a數組的數組元素又是引用類型a = new int[4][];// 把a數組當成一維數組,遍歷a數組的每個數組元素for (int i = 0, len = a.length; i < len; i++) {System.out.println(a[i]); // 輸出 null null null null}// 初始化a數組的第一個元素a[0] = new int[2];// 訪問a數組的第一個元素所指數組的第二個元素a[0][1] = 6;// a數組的第一個元素是一個一維數組,遍歷這個一維數組for (int i = 0, len = a[0].length; i < len; i++) {System.out.println(a[0][i]); // 輸出 0 6}} }上面程序中粗體字代碼部分把 a 這個二維數組當成一維數組處理,只是每個數組元素都是 null,所以看到輸出結果都是 null。下面結合示意圖來說明這個程序的執行過程。
程序中代碼int[][] a;
將在棧內存中定義一個引用變量,這個變量并未指向任何有效的內存空間,此時的堆內存中還未為這行代碼分配任何存儲區。
程序中代碼a = new int[4][];對 a 數組執行初始化,這行代碼讓 a 變量指向一塊長度為 4 的數組內存,這個長度為 4 的數組里每個數組元素都是引用類型(數組類型),系統為這些數組元素分配默認的初始值:null。此時 a 數組在內存中的存儲示意圖如圖 1 所示。
從圖 1 來看,雖然聲明 a 是一個二維數組,但這里絲毫看不出它是一個二維數組的樣子,完全是一維數組的樣子。這個一維數組的長度是 4,只是這 4 個數組元素都是引用類型,它們的默認值是 null。所以程序中可以把 a 數組當成一維數組處理,依次遍歷 a 數組的每個元素,將看到每個數組元素的值都是 null。
由于 a 數組的元素必須是 int[] 數組,所以接下來的程序對 a[0] 元素執行初始化,也就是讓圖 1 右邊堆內存中的第一個數組元素指向一個有效的數組內存,指向一個長度為 2 的 int 數組。因為程序采用動態初始化 a[0] 數組,因此系統將為 a[0] 所引用數組的每個元素分配默認的初始值:0,然后程序顯式為 a[0] 數組的第二個元素賦值為 6。此時在內存中的存儲示意圖如圖 2 所示。
圖 2 中灰色覆蓋的數組元素就是程序顯式指定的數組元素值。TwoDimensionTest.java 接著迭代輸出 a[0] 數組的每個數組元素,將看到輸出 0 和 6。
是否可以讓圖 2 中灰色覆蓋的數組元素再次指向另一個數組?這樣不就可以擴展成三維數組,甚至擴展成更多維的數組嘛?
不能!至少在這個程序中不能。因為 Java 是強類型語言,當定義 a 數組時,已經確定了 a 數組的數組元素是 int[] 類型,則 a[0] 數組的數組元素只能是 int 類型,所以灰色覆蓋的數組元素只能存儲 int 類型的變量。對于其他弱類型語言,例如 JavaScript 和 Ruby 等,確實可以把一維數組無限擴展,擴展成二維數組、三維數組......,如果想在 Java 語言中實現這種可無限擴展的數組,則可以定義一個 Object[] 類型的數組,這個數組的元素是 Object 類型,因此可以再次指向一個 Object[] 類型的數組,這樣就可以從一維數組擴展到二維數組、三維數組......
從上面程序中可以看出,初始化多維數組時,可以只指定最左邊維的大小;當然,也可以一次指定每一維的大小。例如下面代碼:
// 同時初始化二維數組的兩個維數 int[][] b = new int[3][4];上面代碼將定義一個 b 數組變量,這個數組變量指向一個長度為 3 的數組,這個數組的每個數組元素又是一個數組類型,它們各指向對應的長度為 4 的 int[] 數組,每個數組元素的值為 0。這行代碼執行后在內存中的存儲示意圖如圖 3 所示。
還可以使用靜態初始化方式來初始化二維數組。使用靜態初始化方式來初始化二維數組時,二維數組的每個數組元素都是一維數組,因此必須指定多個一維數組作為二維數組的初始化值。如下代碼所示:
// 使用靜態初始化語法來初始化一個二維數組 String[][] str1 = new String[][]{new String[3], new String[]{"hello"}}; // 使用簡化的靜態初始化語法來初始化二維數組 String[][] str2 = {new String[3], new String [] {"hello"}};上面代碼執行后內存中的存儲示意圖如圖 4 所示。
通過上面講解可以得到一個結論:二維數組是一維數組,其數組元素是一維數組。三維數組也是一維數組,其數組元素是二維數組…… 從這個角度來看,Java 語言里沒有多維數組。
總結
以上是生活随笔為你收集整理的int数组初始化_Java中到底有没有多维数组的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: .net bootstrap 下拉树状选
- 下一篇: python医学应用_数据分析工具鄙视链