-
Java語言裏提供了支持多維數組的語法。
-
如果說可以把一維數組當成幾何中的線性圖形,那麼二維數組就相當於是一個表格,像Excel中的表格一樣。
-
對於二維數組的理解,我們可以看成是一維數組array1又作爲另一個一維數組array2的元素而存在。其實,從數組底層的運行機制來看,其實沒有多維數組。
二維數組的使用:
規定:二維數組分爲外層數組的元素,內層數組的元素
-
int[][] arr = new int[4][3];
-
外層元素:arr[0],arr[1]等
-
內層元素:arr[0][0],arr[1][2]等
1、理解:對於二維數組的理解,我們可以看成是一維數組array1又作爲另一個一維數組array2的元素而存在。從數組底層的運行機制來看,其實沒有多維數組。
如何理解二維數組?
數組屬於引用數據類型
數組的元素也可以是引用數據類型
一個一維數組A的元素如果還是一個一維數組類型的,則,此數組A稱爲二維數組。
2、二維數組的使用:
- ① 二維數組的聲明和初始化
- ② 如何調用數組的指定位置的元素
- ③ 如何獲取數組的長度
- ④ 如何遍歷數組
- ⑤ 數組元素的默認初始化值 :
- ⑥ 數組的內存解析 :
public class Test {
public static void main(String[] args) {
//1.二維數組的聲明和初始化
//一維數組的靜態初始化和二維數組的靜態初始化相類似。
int[] arr = new int[]{1,2,3};//舉例:一維數組的靜態初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};//二維數組的靜態初始化
//動態初始化方式1
String[][] arr2 = new String[3][2];
//動態初始化方式2
String[][] arr3 = new String[3][];
//錯誤的情況
// String[][] arr4 = new String[][4];
// String[4][3] arr5 = new String[]0[];
// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
//正確寫法:
int[][] arr4 = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};//標準寫法。
//int arr4[][] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
//int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
//int[] arr4[] = {{1,2,3},{4,5},{6,7,8}};
//2.如何調用數組的指定位置的元素
System.out.println(arr1[0][1]);//2,將arr1中的2進行輸出
System.out.println(arr2[1][1]);//null,想要輸出arr2中第二行第二列,我們雖然沒有對其進行賦值,但是String已經對其賦值,即爲null
//System.out.println(arr3[1][0]);不能這樣寫,會報錯,因爲arr3中的列爲空,沒有指定(賦值)過。
//所以要先對arr3進行指定(賦值),在進行調用。
arr3[1] = new String[4];
System.out.println(arr3[1][0]);
//3.獲取數組的長度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//4
//4.如何遍歷二維數組
for(int i = 0;i < arr4.length;i++){
for(int j = 0;j < arr4[i].length;j++){
System.out.print(arr4[i][j] + " ");
}
System.out.println();
}
}
}
規定:二維數組分爲外層數組的元素,內層數組的元素
int[][] arr = new int[4][3];
外層元素:arr[0],arr[1]等
內層元素:arr[0][0],arr[1][2]等
⑤ 數組元素的默認初始化值 :(外層元素和內層元素的初始化值有區別)
只能拿動態初始化值來說明,因爲靜態的已經確認了,看不到。
針對於初始化方式一:比如:
-
int[][] arr = new int[4][3];
-
外層元素的初始化值爲:地址值
-
內層元素的初始化值爲:與一維數組初始化情況相同
針對於初始化方式二:比如:
-
int[][] arr = new int[4][];
-
外層元素的初始化值爲:null
-
內層元素的初始化值爲:不能調用,否則報錯。
public class Test {
public static void main(String[] args) {
int[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742 ,輸出的是地址值。
System.out.println(arr[0][0]);//0
// System.out.println(arr);//[[I@6d06d69c ,輸出的是二維數組的地址值因爲有兩個[[
System.out.println("*****************");//分隔線
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//輸出的還是地址值
System.out.println(arr1[0][0]);//0.0
System.out.println("*****************");//分隔線
String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//地址值 ,還是一維數組的地址值
System.out.println(arr2[1][1]);//null ,沒有給過定義,還是String給的定義
System.out.println("*****************");//分隔線
//特殊情況
double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null
// System.out.println(arr3[1][0]);//報錯,沒有給過定義,空指針異常
}
}
⑥ 數組的內存解析 :
第一行代碼的解釋。
堆地址值0×1234賦值給棧空間的arr1,然後通過地址值,棧空間的arr1可以指向堆空間的地址值
而且因爲是int[4][ ],後面的[]沒有寫,意味着堆裏面的每一項(圖中的4個格子)沒有初始化(賦過值)。所以此時裏面應該是null
第二行代碼的解釋:
因爲又新建了一個值 arr1[1] = new int[]{1,2,3}
所以又重新開闢了一個新的數組,重新給予了地址值0×7788。
數組中原始的應該是0,但我們給了值,所以應該是1,2,3。
第三行代碼的解釋:
第四行代碼的解釋: