Java语言里提供了支持多维数组的语法。如果说可以把一维数组当成几何中的线性图形, 那么二维数组就相当于是一个表格。

二维数组、三位数组以至于n维数组在本质上是一致的,因此,本文主要讨论二维数组,多维数组可以以二维数组作类比。

对于二维数组的理解,我们可以看成是一维数组 array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组

一、多维数组的声明和初始化

1.1 多维数组的声明方式

语法格式:

数据类型[][] 数组名;// 首选的方法
或
数据类型[] 数组名[];// 效果相同,但不是首选方法
或
数据类型 数组名[][];// 效果相同,但不是首选方法

1.2 多维数组的静态初始化、

语法格式:

数据类型[][] 数组名 = {{值1,值2,···,值i},···,{值1,值2,···,值j}};
或
数据类型[][] 数组名 = new 数据类型[][]{{值1,值2,···,值i},···,{值1,值2,···,值j}};

1.3 多维数组的动态初始化

语法格式1:

数据类型[][] 数组名 = new 数据类型[数组元素个数1][数组元素个数2];

例如int[][] arr = new int[3][2];定义了名称为arr的二维数组。二维数组中有3个一维数组 每一个一维数组中有2个元素 一维数组的名称分别为arr[0], arr[1], arr[2] 给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;

语法格式2:

数据类型[][] 数组名 = new 数据类型[数组元素个数1][];

例如int[][] arr = new int[3][]; 二维数组中有3个一维数组。 每个一维数组都是默认初始化值null (注意:区别于格式1) 可以对这个三个一维数组分别进行初始化 arr[0] = new int[3]; arr[1] = new int[1]; arr[2] = new int[2];

二、多维数组元素的引用

与一维数组类似,通过索引(下标)的方式实现。

语法格式:

数组名[数组元素下标1][数组元素下标2];

三、多维数组获取数组长度

数组名.length;表示二维数组有多少个一维数组。

数组名[元素下标].length;表示数组元素第 元素下标 个一维数组有多少个元素。

四、多维数组的遍历

使用双层循环实现。

五、 多维数组元素的默认初始化值

规定:二维数组分为外层数组的元素,内层数组的元素。例如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
  • 内层元素的初始化值为:不能调用,否则报错。

六、多维数组的内存解析

例如:

int[][] arr = new int[4][];//①
arr[1] = new int[]{1,2,3};//②
arr[2] = new int[4];//③
arr[2][1] = 30;//④

①时内存状态:

java 定义变长多维数组 java多维数组的定义_javase

②时内存状态:

java 定义变长多维数组 java多维数组的定义_一维数组_02

③时内存状态:

java 定义变长多维数组 java多维数组的定义_二维数组_03

④时内存状态:

java 定义变长多维数组 java多维数组的定义_java_04

七、多维数组使用案例

7.1 二维数组基本操作

//二维数组的声明   三种形式
//声明int类型的二维数组  
int[][] intArray;  
//声明float类型的二维数组  
float floatArray[][];  
//声明double类型的二维数组  
double[] doubleArray[];  
//创建一个三行三列的int类型的数组  
intArray=new int[3][3];  
System.out.println("intArray数组的第3行第2列的元素为:"+intArray[2][1]);  
//为第2行第3个元素赋值为9  
intArray[1][2]=9;  
System.out.println("intArray数组第2行第3列的元素为:"+intArray[1][2]);  
//声明数组的同时进行创建  
char[][] ch=new char[3][5];  
//创建float类型的数组时,只指定行数  
floatArray=new float[3][];  
//System.out.println(floatArray[0][0]);  
//每行相当于一个一维数组,需要创建  
floatArray[0]=new float[3];//第一行有三列  
floatArray[1]=new float[4];//第二行有四列  
floatArray[2]=new float[5];//第三行有5列  
System.out.println(floatArray[0][0]);  
//System.out.println(floatArray[0][3]);//数组下标越界 //二维数组的初始化  
int[][] num={{1,2,3},{4,5,6},{7,8,9}};   
System.out.println("num数组第1行第2列的元素为:"+num[0][1]);  
System.out.println("num数组的行数为:"+num.length);  
System.out.println("num数组的列数为:"+num[0].length); 
int[][] num1={{78,98},{65,75,63},{98}};  
System.out.println("num1数组的第1行的列数为:"+num1[0].length);  
//循环输出二维数组的内容  
for(int i=0;i<num1.length;i++){  
    for(int j=0;j<num1[i].length;j++){
        System.out.print(num1[i][j]+"     ");  
    }  
    System.out.println();  
}

7.2 打印杨辉三角

使用二维数组打印一个 10 行杨辉三角。

杨辉三角:

  • 第一行有 1 个元素, 第 n 行有 n 个元素
  • 每一行的第一个元素和最后一个元素都是 1
  • 从第三行开始, 对于非第一个元素和最后一个元素的元素。存在yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];关系
int[][] yanghui = new int[10][];
int i, j;
for (i = 0; i < yanghui.length; i++) {
    yanghui[i] = new int[i + 1];
    for (j = 0; j < yanghui[i].length; j++) {
        if (j == 0 || j == yanghui[i].length - 1) {
            yanghui[i][j] = 1;
        } else {
            yanghui[i][j] = yanghui[i - 1][j - 1] + yanghui[i - 1][j];
        }
    }
}
for (i = 0; i < yanghui.length; i++) {
    for (j = 0; j < yanghui[i].length; j++) {
        System.out.print(yanghui[i][j] + " ");
    }
    System.out.println(" ");
}