二维数组的使用

二维数组的理解

  • 二维数组是一维数组的数组
  • 内存中并没有存在真正的二维数组,只不过是一维数组中装了一维数组

二维数组的声明和初始化

要想使用二维数组,首先要进行声明和初始化

二维数组的声明声明(declaration)

  • 声明二维数组的三种格式
  • 格式一
数据类型[][] 二维数组名;
  • 格式二
数据类型 二维数组名[][];(废弃,不要使用)
  • 格式三(奇怪的写法)
数据类型[] 二维数组名[];(废弃,不要使用)
  • 注意格式二和格式三是C语言的风格的声明方式,不要在Java里使用
  • 一些奇怪的面试题目
int a,b; //声明了两个int变量
int[] m,n[]; //分别声明一维数组m,二维数组n

二维数组的初始化(initialization)

  • 初始化二维数组的三种格式
  • 静态初始化
二维数组名 = new 数据类型[][]{{元素1,元素2,元素..},{元素1..}...};
//可以简写为下面格式

数据类型[][] 二维数组名 = {{元素1,元素2,元素…},{元素1…}…};
```

  • 二维数组静态初始化也可以简写,直接写元素
  • 二维数组静态初始化的简写方式,必须和声明一起使用
  • 动态初始化格式一
二维数组名 = new 数据类型[m][n];
  • m代表二维数组当中,一维数组的个数
  • n代表二维数组当中,每个一维数组有多少元素
  • 通过这种方式创建的二维数组,里面的每个一维数组的长度都相同
  • 动态初始化格式二
二维数组名 = new 数据类型[m][];
  • m代表二维数组当中,一维数组的个数
  • 没有直接给出一维数组的长度,可以动态给出
  • 该形式定义的二维数组仍不能使用,还需要手动初始化二维数组中的每一个一维数组
  • 手动初始化二维数组中一维数组的过程和初始化普通一维数组差不多
  • 但是手动初始化一维数组时,不能使用简化版的一维数组静态初始化
  • 该方式牺牲了便利性,获得了灵活性
  • 错误的格式
  • 除了三种正确的,都是错误的,例如下面
// 二维数组名 = new 数据类型[][n]; 错误❌
// 二维数组名 = new 数据类型[m][n]{{元素1,元素2,元素..},{元素1..}...}; 错误❌

二维数组的访问

二维数组访问元素和一维数组并无实质不同,其中

数组长度

  • 获取二维数组的长度
  • 语法
二维数组名.length;
  • 二维数组的长度实质上是其中一维数组的个数
  • 二维数组的长度和动态初始化中的m数值相等
  • 获取二维数组中一维数组的长度
  • 语法
二维数组名[m].length;
  • 只有二维数组中的一维数组完成初始化,才能够使用这种形式
  • 不然会空指针异常
  • m必须是一个存在的下标,不然会空指针异常
  • 二维数组中一维数组的长度和动态初始化方式一中的n数值相等

访问二维数组中的某个一维数组

  • 语法
二维数组名[m];
  • 只有二维数组中的一维数组完成初始化,才能够使用这种形式
  • m必须是一个存在的下标,不然会空指针异常
  • 获取一维数组后,可以进行各种一维数组的操作

获取指定位置的元素

  • 语法
二维数组名[m][n];
  • 对于静态初始化二维数组
  • m表示二维数组中一维数组的位置,最小是0,最大是m-1(或者二维数组长度-1)
  • n表示在指定一维数组中元素的位置,最小是0,最大是n-1(或者一维数组长度-1)
  • 对于动态初始化格式一的二维数组(明确指出m,n的取值)
  • m表示二维数组中一维数组的位置,最小是0,最大是m-1(或者二维数组长度-1)
  • n表示在指定一维数组中元素的位置,最小是0,最大是n-1(或者一维数组长度-1)
  • 动态初始化后如果没有再赋值,得到的是默认初始值
  • 对于动态初始化格式二的二维数组(明确指出m,n未知)
  • 这种格式初始化的二维数组,不能直接使用,必须先初始化其中的一维数组
  • 初始化一维数组后,再根据m,n的取值获取相应位置的元素