提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
前言
二维数组其实还是一个一维数组,只是他存放的元素又是一个数组。
一、二维数组声明
数据类型[ ][ ] 数组名 = new 数据类型[长度 ][长度 ] ;
举例:
int[][] arr = new int[2][5];
//声明了一个长度为2的二维数组,里面每个元素数组的长度是5
二、二维数组使用
1.静态初始化
声明一个长度为3的二维数组,里面子元素的值如下:
int[][] arr = new int[][]{
{11,12,13,14,15},
{21,22,23,24,25},
{31,32,33,34,35}
};
arr数组的第一个元素是一个数组,值是 {11,12,13,14,15};
2.动态初始化
给定长度,但是不直接给出元素值.
int类型的数组默认初始化值是0
String类型数组默认初始化值是null
int[][] arr2 = new int[3][3];
arr2[0][0] = 12;
arr2[0][2] = 99;
System.out.println(arr2[0][0]); // 12
System.out.println(arr2[0][2]); // 99
String[][] str = new String[3][3];
System.out.println(str[1][1]); // null
3.访问二维数组元素
1、访问某个指定的元素,一定要给出完整的索引。
参见上一段代码。
2、遍历二维数组(循环嵌套)
第一层for循环先访问二维数组的第一个元素,第二层for循环根据二维数组第一个元素的长度访问二维数组第一个元素里面的所有元素,其他同理。
public static void main(String[] args) {
int[][] arr = new int[][]{
{11, 12, 13, 14, 15},
{21, 22, 23, 24, 25},
{31, 32, 33, 34, 35}
};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
三、二维数组内存分析
一定要注意 数组名 = 数组名 ;这样的操作,这样是把堆内存空间中的同一块new出来的区域指向两个数组,其中任意一个数组修改数组中的值,另一个数组再访问数组时,值都是修改过的。
四、二维数组常见问题
同为一维数组出现的问题,空指针异常和索引越界。
//空指针异常
int arr = new int[5][];
System.out.println(arr[5][0]);//NullPointerException
五、二维数组应用案例
N行的杨辉三角形
杨辉三角中的每一个数等于他头上的元素以及头上元素的左边一个元素的和。
public static void main(String[] args) {
int row = 10;
//声明一个10行长度的二维数组存放杨辉三角的数
int[][] yangHui = new int[10][];
//因为每一行的元素都不同,所以只声明二维数组的总长度,但是子元素的长度是变化的,子元素长度应该动态的初始化
//先根据长度访问二维数组
for (int i = 0; i < yangHui.length; i++) {
//数组必须先初始化值才能访问使用,声明二维数组子元素的长度
yangHui[i] = new int[i + 1];
//杨辉三角首尾元素赋值都是1
yangHui[i][0] = 1;
yangHui[i][i] = 1; // 等价于 yangHui[i][yangHui[i].lenght-1];
//二维数组子元素初始化完成,就可以访问了
//首尾元素值已经给出了,所以只需要给中间的元素赋值,从第3行开始
if (i >= 2) {
for (int j = 1; j < yangHui[i].length - 1; j++) {
yangHui[i][j] = yangHui[i - 1][j - 1] + yangHui[i - 1][j];
}
}
}
System.out.println("10行的杨辉三角形:");
//遍历二维数组
for (int i = 0; i < yangHui.length; i++) {
for (int j = 0; j < yangHui[i].length; j++) {
System.out.print(yangHui[i][j] + "\t");
}
System.out.println();
}
}
总结
二维数组能看懂声明和子元素的声明访问,了解内存结构,重点掌握二维数组的循环嵌套遍历。