简介
二维数组本质上也是一维数组,只不过每个元素又是一个一维数组 ,所以可以将它看作是一维数组的嵌套。
二维数组内存结构
如上图所示可以看出二维数组内元素保存的其实是若干个一维数组的引用(或者说内存地址)。在定义二维数组时,会在堆内存为其分配内存空间,所以必须知道二维数组的行数,也就是一维数组的个数,才能够为其分配内存空间。这也是为什么在初始化时可以省略列数,不可以省略行数的原因。
上面提到了列和行,二维数组的行可以看作是一维数组的个数,而它的列则可以看作是一维数组的大小。
初始化方式
1.静态初始化
数据类型 [ ][ ] 数组名 = {{元素1,元素2…},{元素1,元素2…},{元素1,元素2…}…};
例如:
int[][] array = {{1,2},{3,4},{5,6}};
2.动态初始化
- 数据类型[ ][ ] 数组名 = new 数据类型 [m][n]
- 数据类型 数组名[ ][ ] = new 数据类型 [m][n]
- 数据类型[ ] 数组名[ ] = new 数据类型 [m][n]
上面三种动态初始化方式效果都是一样的,不过为了规范起见还是使用第一种比较好。
//定义一个三行四列的数组
int[][] array = new int[3][4];
int array[][] = new int[3][4];
int[] array[] = new int[3][4];
除了这样,动态初始化时还可以省略列数,也是可行的。
- 数据类型[ ][ ] 数组名 = new 数据类型 [m][ ]
例如:
//声明一个二维数组,用于存储3个一维数组,至于每一个一维数据存多少个数据,不知道。
int[][] array = new int[10][];
遍历方式
1.for循环遍历
由于上面提到过,二维数组的行可以看作是一维数组的个数,而它的列则可以看作是一维数组的大小。所以可以很方便的就用for循环来完成遍历。
public class TestDemo {
public static void main(String[] args){
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
for (int i = 0; i < array.length; i++) { //二维数组的大小(即二维数组中有多少个一维数组)
for (int j = 0; j < array[i].length; j++) { //遍历每一个一维数组
System.out.print(array[i][j]+" ");
}
System.out.println();
}
}
}
打印结果:
1 2 3
4 5 6
7 8 9
2.foreach遍历
public class TestDemo {
public static void main(String[] args){
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
for (int[] arr : array) { //int[]为二维数组中元素的类型, arr为迭代变量, array为要遍历的二维组的名称
for (int i: arr) { //int为一维数组中元素的类型,i为迭代变量,arr是一维数组的名称
System.out.print(i+" ");
}
System.out.println();
}
}
}
打印结果:
1 2 3
4 5 6
7 8 9
3.除了这两种方式之外,for循环还能和foreach循环搭配使用。
public class TestDemo {
public static void main(String[] args){
int[][] array = {{1,2,3},{4,5,6},{7,8,9}};
for (int[] arr : array) {
for (int i=0;i<arr.length;i++) {
System.out.print(arr[i]+" ");
}
System.out.println();
}
}
}
打印结果:
1 2 3
4 5 6
7 8 9