一、多維數組簡介
1.為什么需要二維數組
我們看下面這個例子?“
????????某公司2022年全年各個月份的銷售額進行登記。按月份存儲,可以使用一維數組。如果改寫為按季度為單位存儲怎么辦呢?
????????或許現在學習了一維數組的你只能申請四個一維數組去存儲每個季度的銷售額吧?和一一維數組的思想一樣,能不能有一個容器將這四個一維數組裝起來然后提供一個統一的變量名供我們使用呢?答案是肯定的。我們在學習一維數組的時候也學到,數組的元素可以是基本數據類型也可以是引用數據類型,而數組本身就是引用數據類型。所以可以將數組作為數組的元素,這就是多維數組。
例如:
按月份 | int[] monthData = new int[]{23,43,22,34,55,65,44,67,45,78,67,66}; |
按季度 | int[][] quarterData = new int[][]{{23,43,22},{34,55,65},{44,67,45},{78,67,66}}; |
總結:
|
二、二維數組的聲明與初始化
1.二維數組的聲明
語法格式 | //推薦 //不推薦(但可行) |
舉例 | public class Test20TwoDimensionalArrayDefine { ? ? ? ? //存儲多組姓名 ????????int[] x, y[];//x是一維數組,y是二維數組 |
2.二維數組的靜態初始化
格式 | int[][] arr = new int[][]{{3,8,2},{2,7},{9,0,1,6}}; |
舉例 | int[][] arr = {{1,2,3},{4,5,6},{7,8,9,10}};//聲明與初始化必須在一句完成(類型推斷) int[][] arr = new int[][]{{1,2,3},{4,5,6},{7,8,9,10}}; int[][] arr; arr = new int[3][3]{{1,2,3},{4,5,6},{7,8,9,10}};//錯誤,靜態初始化右邊new 數據類型[][]中不能寫數字 注意:二維數組也有length屬性。例如:arr.length;與 arr[2].length; |
3.二維數組的動態初始化
a)使用場景
如果二維數組的每一個數據,甚至是每一行的列數,需要后期單獨確定,那么就只能使用動態初始化方式了。動態初始化方式分為兩種格式。
b)格式一:規則二維表(每一行的列數是相同的)
格式 | //(1)確定行數和列數 //此時創建完數組,行數、列數確定,而且元素也都有默認值 //(2)再為元素賦新值 |
舉例 | int[][] arr = new int[3][2];
|
c)格式二:不規則二維表(每一行的列數不一樣)
格式 | //(1)先確定總行數 //此時只是確定了總行數,每一行里面現在是null //(2)再確定每一行的列數,創建每一行的一維數組 //此時已經new完的行的元素就有默認值了,沒有new的行還是null //(3)再為元素賦值 |
舉例 | int[][] arr = new int[3][];
|
4.數組的長度和角標
說明 |
|
舉例 | public class Test22TwoDimensionalArrayUse { ? ? ? ? int[][] scores = { ? ? ? ? System.out.println(scores);//[[I@15db9742 ? ? ? ? //[[:代表二維數組,I代表元素類型是int ? ? ? ? System.out.println("第1組有" + scores[0].length +"個學員."); ? ? ? ? System.out.println("第1組的每一個學員成績如下:"); |
三、二維數組的遍歷
格式 | for(int i=0; i<二維數組名.length; i++){ //二維數組對象.length ? ? for(int j=0; j<二維數組名[i].length; j++){//二維數組行對象.length ? ? ? ? System.out.print(二維數組名[i][j]); ? ? } ? ? System.out.println(); } |
舉例 | public class Test23TwoDimensionalArrayIterate { ? ? ? ? System.out.println("一共有" + scores.length +"組成績."); |
四、二維數組的默認值
舉例 | ①int[][] arr1 = new int[][]; ②int[][] arr2 = new int[2][]; ③int[][] arr3 = new int[3][3]; ...... |
說明 | ①寫法是錯誤的,因為在創建二維數組的時候缺少維數,不知道創建多大空間。 ②創建一個有兩個元素的二維數組,由于兩個元素并未定義,而二維數組是引用數據類型,所以兩個元素的默認值均為null。 ③創建一個有三個元素的二維數組,由于三個元素均定義為int類型的一維數組,所以二維數組的三個元素保存的是三個一維數組的地址值。而三個一維數組是int類型一維數組,所以默認值是0。 ...... |
總結 | ①byte、short、int的默認值是0 ②long的默認值是0L ③float的默認值是0.0F ④double的默認值是0.0 ⑤char的默認值是0或‘\u0000’(表現為空) ⑥boolean的默認值是false ⑦引用類型的默認值是null |
五、內存解析
解析一:
解析二:
?
六、案例
案例一:獲取arr數組中所有元素的和。
public class test { ?? ?public static void main(String[] args) { ?? ??? ?int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}}; ?? ??? ? ?? ??? ?int sum = 0; ?? ??? ?for(int i=0;i<arr.length;i++){ ?? ??? ??? ?for(int j=0;j<arr[i].length;j++){ ?? ??? ??? ??? ?sum += arr[i][j]; ?? ??? ??? ?} ?? ??? ?} ?? ??? ?System.out.println("總和為:" + sum); ?? ?} } |
案例二:聲明:int[] x,y[]; 在給x,y變量賦值以后,以下選項允許通過編譯的是:
聲明:int[] x,y[]; 在給x,y變量賦值以后,以下選項允許通過編譯的是: 提示: |
案例三:使用二維數組打印一個 10 行楊輝三角。
public class YangHuiTest { ? ? ? ? //1. 動態初始化的方式創建二維數組 ? ? ? ? for (int i = 0; i < yangHui.length; i++) { ? ? ? ? ? ? //2. 給數組元素賦值 ? ? ? ? ? ? //2.2 給外層數組元素中的非首元素和非末元素賦值(難) ? ? ? ? ? ? ? ? } ? ? ? ? //3. 遍歷二維數組 ? ? ? ? ? ? System.out.println(); ? ? } |