二维数组
数组,本身是引用类型的变量。
数组的元素,可以是基本数据类型,也可以是引用数据类型。
如果有这样一个数组,数组中的每一个元素,都是一个一维数组,那么这个数组就是二维数组。
如何理解arra[x][y]能够访问到二维数组的元素?
一维数组 int[] arra, arra变量指向了这个一维数组(即arra中存放该数据的地址),规定,通过存放有数组地址的变量后面跟上“【x】”的形式(arra[x]),可以访问到数组中的元素。
二维数组 int[][] arra
如果arra[x]访问到了,是一个一维数组的地址的话,我们就可以通过arra[x][y]的方式访问到二维数组中的元素
1.二维数组的声明与初始化
int[][] scores = null;
//静态初始化
scores = new int[][]{{50,60,70},{88,99},{66,87,98}};
//动态初始化1
String[][] names = new String[3][2];
//动态初始化2
boolean[] isGirl[] = new boolean[2][];
isGirl[0] = new boolean[3];
isGirl[1] = new boolean[]{false,true};
错误的初始化方式:
int[][] nums1 = new int[][4];
int[][] nums2 = new int[4][3]{{50,60,70},{88,99},{66,87,98}};
int[4][3] nums1 = new int[][];
2.如何引用二维数组元素:调用下角标的方式
names[0][1]
3.二维数组的属性:长度
System.out.println(scores.length);//3
System.out.println(scores[0].length);//3
System.out.println(scores[1].length);//2
4.遍历二维数组元素
for(int i = 0;i < scores.length;i++){
for(int j = 0;j < scores[i].length;j++){
System.out.print(scores[i][j] + "\t");
}
System.out.println();
}
5.二维数组元素的默认初始化值
//byte/short/int/long类型的二维数组的初始化元素为:0
//float/double类型的二维数组的初始化元素为:0.0
//char类型的二维数组的初始化元素为:'\u0000'
//boolean类型的二维数组的初始化元素为:false
//引用类型的默认初始化值为:null
6.二维数组的内存结构
执行如下代码发生了什么?
int[][] nums=new int[3][];
nums[0]=new int[3];
num[0][2]=5;
局部变量在栈中,new出来的对象,在堆中
(1)int[][] nums=new int[3][];
执行这条语句,会在栈中生成nums的变量,nums的值,是数组在堆中的地址0x2233(也就是nums指向堆中的一个数组),每一个元素的类型都是int[],是引用数据类型的,所以,初始化值为null
(2)nums[0]=new int[3]
这时,在堆中又生成一个int[]类型的数组,数组中的元素是int,所以初始化的值是0.
把int[]数组的地址(0x8899)赋值给nums[0],这时,nums[0]也就指向了新生成的一维数组
(3)num[0][2]=5
num[0]指向了一维数组,nums[0][2]就是改一维数组的第三个元素。
int[][] nums1 = new int[3][];
System.out.println(nums1);//地址值
System.out.println(nums1.length);//3
System.out.println(nums1[0]);//null
int[][] nums2 = new int[3][2];
System.out.println(nums2[0]);//地址值
int[][] nums3 = new int[3][];
//nums3[0] = new int[2];
System.out.println(nums3[0][0]);//运行时报错
这是非常典型的错误,一定要注意,因为int3[0]的值是null,所以,不能通过之歌null值找到
nums3[0][0]