[TOC]
6.2 多维数组
内容导视:
- 二维数组声明
- 遍历二维数组
- 静态方法调用
6.2.1 二维数组声明
二维以上的数组用的很少,故略去。
声明二维数组
int[][] arr1;
int arr2[][];
int []arr3[];
一般使用第一种。
静态初始化
二维数组由多个一维数组组成(二维数组的每一个元素是一维数组),三维数组有多个二维数组组成...
int[] i1 = {5, 6, 7, 8};
int[] i2 = {63, 262, 2};
int[] i3 = {5, 2, 6};
int[][] arr1 = {i1, i2, i3};
int[][] arr2 = {
{252, 26, 3},
{1, 2, 3},
{6, 4, 2}
};
动态初始化
语法:
数据类型[][] 数组名 = new 数据类型[二维数组的长度][一维数组的长度];
例:
int[][] arr = new int[2][3];
代表创建了一个 int 类型、长度为 2 的二维数组;(对于引用类型,只保存内存地址)
而二维数组中的每个元素都保存着 int 类型、长度为 3 的一维数组的内存地址。(但通常说二维数组里的每个元素是 int 类型、长度为 3 的一维数组)
访问
// 二维数组中的每一个元素都是一维数组,如 arr[0] 是 int[] 类型
int[][] arr = new int[2][3];
// arr[0] 代表二维数组中下标为 0 的元素,也就是一维数组,把一维数组的地址赋给 arr1
int[] arr1 = arr[0];
// 给 arr1 数组的下标为 0 的元素赋值 67
arr1[0] = 67;
// 获取 arr1 数组下标为 0 的元素
int num1 = arr1[0];
System.out.println(num1);
合并
int[][] arr = new int[2][3];
// 下标为 0 就是数组中的第一个元素
// 给 arr 下标为 0 的一维数组中的下标为 0 的元素赋值 67
arr[0][0] = 67;
// 访问 arr 下标为 0 的一维数组中的下标为 0 的元素
int num1 = arr[0][0];
System.out.println(num1);
例子:
int[][] arr = new int[2][3];
// 赋值
arr[0][0] = 52;
arr[0][1] = 5;
arr[0][2] = 62;// 现在下标为 0 的一维数组:{52, 5, 62}
arr[1][0] = 2;
arr[1][1] = 8;
arr[1][2] = 6;// 现在下标为 1 的一维数组:{2, 8, 6}
// 访问下标为 0 的数组的所有元素
int n1 = arr[0][0];
int n2 = arr[0][1];
int n3 = arr[0][2];
// 访问下标为 1 的数组的所有元素
int m1 = arr[1][0];
int m2 = arr[1][1];
int m3 = arr[1][2];
// 注意二维数组长度为 2,一维数组长度为 3,下标别越界。(下标别超过 length - 1)
当一维数组的长度不确定时,就不能使用上述方式动态初始化。
动态初始化 2
假如确定了二维数组的长度为 4,
int[][] arr = new int[4][]; 此时内存图如下:(因为一维数组是引用类型,不赋值默认为 null)
System.out.println(arr[0]);// null
// 使用 null 获取什么都会抛出 java.lang.NullPointerException 空指针异常
System.out.println(arr[0].length);
这类运行时异常,编译时检查不出来。
以后需要时再创建一维数组:
arr[0] = new int[1];
arr[1] = new int[2];
arr[2] = new int[3];
6.2.2 遍历二维数组
先得到每一个元素,也就是一维数组,再遍历一维数组:
int[][] total = new int[3][3];
for (int i = 0; i < total.length; i++) {
int[] arr = total[i];
for (int j = 0; j < arr.length; j++) {
System.out.print(arr[j] + ",");
}
System.out.println("一维数组遍历完毕");
}
合并
int[][] total = new int[3][3];
for (int i = 0; i < total.length; i++) {
for (int j = 0; j < total[i].length; j++) {
System.out.print(total[i][j] + "\t");
}
System.out.println();
}
6.2.3 静态方法调用
每次都是重复的代码,有点厌倦了,所以需要方法封装重复的代码了;只讲一点点。
class A {
public static void f1(int[] arr) {}
public static int sum(int a1, int a2) {return a1 + a2}
}
方法的第 3 个单词如 void、int...代表返回值,如果没有返回值就写 void,有返回值,就写返回值的类型,然后在方法结尾处写上 return 要返回的值;
f1、sum 是方法名,自己定义,符合标识符规则就行。
方法名后的是形式参数列表,可以定义任意个变量,变量之间使用英文逗号分隔,将来调用时传入实际参数,注意实际参数的个数和类型要与形式参数对应上。
如何使用方法?(调用方法)
在同一个类中,直接通过方法名(实参)调用。
class A {
public static void main(String[] args) {
// 使用 int 类型的变量接收返回值
// int num1 = 4; int num2 = 5;
int sum = sum(4, 5);
System.out.println(sum);// 9
}
// 返回 num1 + num2
public static int sum(int num1, int num2) {
return num1 + num2;
}
}
在同一个包下(同级目录),不同类中,使用类名.方法名(实参)调用:
class A {
public static void main(String[] args) {
System.out.println(B.f1());// 1
}
}
class B {
public static int f1() {return 1;}
}
不同包下的类需要导入,如使用其它包下的 Arrays 类,关于方法详细请看 API 文档;如果以后编译时说找不到符号,想一想自己导入了此类没有。
import java.util.Arrays;
class A {
public static void main(String[] args) {
int[] arr = {5, 26, 3};
System.out.println(Arrays.toString(arr));// [5, 26, 3]
}
}