二维数组本质上还是一维数组,只不过数组的元素也是数组。

二维数组的声明遵循以下格式:

int[][] arr; // int arr[][]; 也行

二维数组的初始化

静态初始化

静态初始化直接在定义二维数组的同时就为数组元素分配空间并赋值,例如:

int[][] arr1 = {{1,2},{4,5,6},{4,5,6,7,8,9,9}};
int[][] arr2 =new int[][]{{1,2},{4,5,6},{4,5,6,7,8,9,9}};

动态初始化

动态初始化即二维数组定义与为数组元素分配空间并赋值的操作分开进行,例如:

int[][] arr = new int[3][]; 
arr[0] = new int[]{1,2};
arr[1] = new int[]{3,4,5,6};
arr[2] = new int[]{34,45,56};

默认初始化

如果内层也指定了大小,那么内层数组也和一维数组一样,每种类型的数组有不同的默认初始化值。例如:

int[][] arr = new int[3][2];
for(int[] a: arr){
    for(int num:a){
        System.out.print(num+"\t");
    }
    System.out.println();
}

输出为:

0	0
0	0
0	0

如果声明为:

int[][] arr = new int[3][];
for(int[] a: arr){
    System.out.println(a+"\t");
}

则输出为:

null
null
null

因为二维数组的元素也是数组,而数组是引用类型,所以默认初始化值为 null

注意:下面这种写法是允许的,相当于默认初始化之后,new 一个数组,让 arr[1] 指向这个新数组:

int[][] arr = new int[3][2];
arr[1] = new int[]{1,2,3,4};

二维数组的遍历

  • 外层普通 for 循环+内层普通 for 循环

    for(int i = 0; i < arr.length; i++){
        for(int j = 0; j < arr[i].length; j++){
            System.out.print(arr[i][j]+"\t");
        }
        System.out.println();
    }
    
  • 外层普通 for 循环+内层增强 for 循环

    for(int i = 0; i < arr.length; i++){
        for(int num: arr[i]){
            System.out.print(num+"\t");
        }
        System.out.println();
    }
    
  • 外层增强 for 循环+内层增强 for 循环

    for(int[] a: arr){
        for(int num: a){
            System.out.print(num+"\t");
        }
        System.out.println();
    }
    
  • 外层增强 for 循环+内层普通 for 循环

    for(int[] a: arr){
        for(int i = 0; i < a.length; i++){
            System.out.print(a[i]+"\t");
        }
        System.out.println();
    }
    

内存分析

JavaSE-27-1