二维数组
1.1 二维数组的概念
本质上还是一个一维数组,只是其数组元素又是一个一维数组
举例说明:变量,一维数组,二维数组之间的关系
吸烟:
没钱 1根 一个变量
稍微有钱 一包 一维数组【20根】
有钱 一条 二维数组【10包】
1.2 二维数组的定义
方式一:元素类型[][] 数组名称;
方式二:元素类型 数组名称[][];
和一维数组一样推荐使用方式一
1.3 二维数组的初始化
静态初始化:
语法:元素类型[][] 数组名称 = new 元素类型[][]{{一维数组1,一维数组2,一维数组3…};
简化:元素类型[][] 数组名称 =m{{一维数组1,一维数组2,一维数组3…};
举例:int[][] arr = new int[][]{{2,3},{5,2,1},{10,45,22,54}};
int[][] arr = {{2,3},{5,2,1},{10,45,22,54}};
动态初始化:
语法:元素类型[][] 数组名称 = new 元素类型[二维数组的长度][一维数组的长度]
举例:int[][] arr = new int[3][4];
说明:定义一个数组arr,二维数组中一维数组的个数为3个,每个一维数组中元素的个数为4个,数组中的值默认为0。
如何创建一个如下的二维数组:外维是3个空间,内维分别是4,5,6个空间。
当时我刚学完二维数组时做这道题都蒙了,因为我在学完一维数组时,就认为数组在动态初始化时一定要给 数组[ ] 这个[ ]中写数字,因为内存要给数组分配空间,但是二维数组只有两个[ ][ ]怎么能给出三个不同长度的一维素组,我那时候一直以为二维数组里面的数组长度是一样的,于是我写成了这样 int[][] a = new int[3][6]
答案:
int[][] a = new int[3][ ]
我个人的理解:
二维数组在动态初始化时一定要给出这个二维数组里包含了几个一维数组,但是这只是给一个二维数组的初始化,内存只给二维素组在栈中赋予了一个地址,而其中的一维素组并没有实际意义,就是null数组,堆中没有空间分配,而至于为什么一位数组在初始化时要在[ ]写下长度,就是因为一维数组只有给定长度才会在栈中有地址指向他,在下面的方法中引用他时才不会出现空指针的问题,而二维数组在初始化时只要给定一位数组的个数,就会有地址指向他,所以java在编译时不会报错
int[][] a = new int[3][];
System.out.println(a);//[[I@7852e922
System.out.println(a[2]);//null
内存中的二维数组
public static void main(String[] args) {
int[][] nums={{10,20,30},{40,50,60}};
int[][] nums2={{1,2},{3,4},{5,6}};
int[][] nums3=new int[3][2];
int[][] nums4=new int[2][];
}
1.4 二维数组的访问
通过下标访问二维数组
public class test1 {
public static void main(String[] args) {
int[][] arr = new int[3][4];
System.out.println(arr);// [[I@15db9742
System.out.println(arr.length);// 3
System.out.println(arr[0]);// [I@6d06d69c
System.out.println(arr[0].length);// 4
System.out.println(Arrays.toString(arr));// [[I@6d06d69c, [I@7852e922,[I@4e25154f]
System.out.println(Arrays.toString(arr[0]));// [0, 0, 0, 0]
System.out.println(arr[0][1]);//0
}
}
遍历二维数组
public class test2 {
public static void main(String[] args) {
// 如果二维数组中一维数组的元素个数不确定
// int[][] arr = new int[3][];
int[][] arr = new int[][] { { 2, 3 }, { 5, 2, 1 }, { 10, 45, 22, 54 } };
// 遍历arr
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
/*
* [I@7852e922 [I@4e25154f [I@70dea4e
*/
// 赋值:给arr中的第1个元素修改值
arr[1] = new int[2];
// 给arr[0]中的第0个元素修改值
arr[0][0] = 10;
// 遍历arr[0]
for (int i = 0; i < arr[0].length; i++) {
System.out.println(arr[0][i]);
}
// 二维数组的遍历:嵌套for循环
// 简单for循环
for (int i = 0; i < arr.length; i++) {
int[] subArr = arr[i];
for (int j = 0; j < subArr.length; j++) {
System.out.println(subArr[j]);
}
}
// 增强for循环
for (int[] subArr1 : arr) {
for (int n : subArr1) {
System.out.println(n);
}
}
}
}
关于数组的小问题总结
无论是一维数组还是二维数组
Java语言中 声明是不能指定其长度[数组中元素的个数]
声明方式:
例如;:
int a [ ] = new int [3];
int a [5]; 非法声明
int intA [ ] [ ] = {{1,2},{2,3},{3,4,5}};
int intB [ 3] [ 2] = {{1,2},{2,4},{4,5}}; 非法声明
还有就是上面那道题的解释