名词解释
- Java 语言里提供了支持多维数组的语法。
- 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像Excel中的表格一样。
- 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存在。其实,从数组底层的运行机制来看,其实没有多维数组。
二维数组的声明和初始化
//1.二维数组的声明和初始化
int[] arr = new int[]{1,2,3};//一维数组
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};//二维数组静态
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
//错误情况
//String[][] arr4 = new String[][4];
//String[4][3] arr5 = new String[][];
//int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};
//正确情况
int arr4[][] = new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr5[] = new int[][]{{1,2,3},{4,5},{6,7,8}};
int[] arr6[] = {{1,2,3},{4,5},{6,7,8}};//声明和静态初始化在一行内可以这样写,称为类型推断。
如何调用数组的指定位置元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null
arr3[1] = new String[4];
System.out.println(arr3[1][0]);
获取数组的长度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//2
如何遍历二维数组
for(int i = 0;i < arr4.length;i++){
for(int j = 0;j < arr4[i].length;j++){
System.out.print(arr4[i][j]);
}
System.out.println();
}
数组元素的默认初始化值
规定:
二维数组分为外层数组元素,内层数组元素
比如: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
内层元素的初始化值为:不能调用,否则报错。
eg:
int[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@15db9742(地址值:一维数组,int型,15db9742)
System.out.println(arr[0][0]);//0
System.out.println(arr);//[[I@6d06d69c(二维数组,int型,6d06d69c)
System.out.println("***********************");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//[F@7852e922(地址值:一维数组,float型,7852e922)
System.out.println(arr1[0][0]);//0.0
System.out.println("***********************");
String[][] arr2 = new String[4][3];
System.out.println(arr2[0]);//[Ljava.lang.String;@4e25154f(地址值:一维数组,String型,4e25154f)
System.out.println(arr2[0][0]);//null
System.out.println("***********************");
double[][] arr3 = new double[4][];
System.out.println(arr3[0]);//null(一维double型数组,是引用类型,所以是null)
//System.out.println(arr3[0][0]);//报错:空指针异常
二位数组内存结构解析
练习1
int[][] arr = new int[][]{{3,5,8},{12,9},{7,0,6,4}};
int sum = 0;
for(int i = 0;i < arr.length;i++){
for(int j = 0;j < arr[i].length;j++){
sum += arr[i][j];
}
}
System.out.println("总和为" + sum);
练习2
声明:int[] x,y[]; 在给x,y变量赋值以后,以下选项允许通过编译的是:
a ) x[0] = y;
b) y[0] = x;
c) y[0][0] = x;
d) x[0][0] = y;
e) y[0][0] = x[0];
f) x = y;
答案:
a)x[0]是数,y是二维,no
b)y[0]和x都是一维,yes
c)y[0][0]是数,x是一维,no
d)x[0][0]不存在,no
e)y[0][0]和x[0]都是数,yes
f) x一维,y二维,no
练习3
public class YangHuiTest {
public static void main(String[] args) {
//1.声明并初始化二维数组
int[][] yangHui = new int [10][];
//2.给数组的元素赋值
for(int i = 0;i < yangHui.length;i++){
yangHui[i] = new int[i + 1];
//2.1给每行首末位赋值
yangHui[i][0] = yangHui[i][i] = 1;
//2.2给每行非首末元素赋值
//if(i > 1){
for(int j = 1;j < yangHui[i].length - 1;j++){
yangHui[i][j] = yangHui[i-1][j-1] + yangHui[i-1][j];
}
//}
}
//3.遍历二维数组
for(int i = 0;i < yangHui.length;i++){
for(int j = 0;j < yangHui[i].length;j++){
System.out.print(yangHui[i][j] + " ");
}
System.out.println();
}
}
}