1.1.6.2 多维数组

145 阅读4分钟

[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]
    }
}