在Java中,二维数组被看作数组的数组,即二维数组是一个特殊的一维数组,二维数组的每个元素都是一个一维数组。
1.二维数组的定义
1)格式一:
元素的数据类型[][] 数组的名字 = new 元素的数据类型[二维数组的长度][一维数组的长度];
int[][] arr = new int[3][2];
以上这种情况代表有3个一维数组,且每个一维数组有2个元素。
2)格式二:
元素的数据类型[][] 数组的名字 = new 元素的数据类型[二维数组的长度][];
int[][] arr = new int[3][];
以上这种情况代表有3个一维数组,但每个一维数组的元素个数不确定,且每个一维数组的元素个数可以不一样。
3)格式三:
元素的数据类型[][] 数组的名字 = {{元素1,元素2,…},{元素1,元素2,…},…};
int[][] arr = {{1,2,3},{4,5},{6,7,8,9}};
以上这种情况代表有3个一维数组,第一个一维数组中有3个元素,第二个一维数组中有2个元素,第三个一维数组中有4个元素,每个一维数组的元素个数可以不一样。
2.二维数组的声明
声明二维数组有下列两种格式:
数组的元素类型 数组名[][];
数组的元素类型 [][] 数组名;
例如:
char cat[][]; char [][] cat;
3.二维数组的初始化
二维数组的初始化同一维数组一样,有两种方式:动态初始化和静态初始化。
(1) 静态初始化
1)先声明再静态初始化
元素的数据类型[][] 二维数组名; 二维数组名 = new 元素的数据类型[][]{{元素1,元素2,元素3,…},{第二行的值列表},…,{第n行的值列表}};
2)声明的同时静态初始化
元素的数据类型[][] 二维数组名 = new 元素的数据类型[][]{{元素1,元素2,元素3,…},{第二行的值列表},…,{第n行的值列表}};
注意:右边“new 元素的数据类型[][]”中“[][]”中不能写数字,因为行数和列数由{}中的元素个数决定。
3)声明的同时静态初始化的简化写法
元素的数据类型[][] 二维数组名 = {{元素1,元素2,元素3,…},{第二行的值列表},…,{第n行的值列表}};
例如:
public class Main { public static void main(String[] args) { int[][] arr = {{1,2,3},{4,5},{6}}; //定义数组 System.out.println(arr[0][0]); //1 System.out.println(arr[1][0]); //4 System.out.println(arr[2][0]); //6 System.out.println(arr[0][1]); //2 System.out.println(arr[1][1]); //5 System.out.println(arr[2][1]); //越界 } }
(2) 动态初始化
动态初始化创建可以不用声明里面一维数组的长度,因此,它每个一维数组长度可以不一样,所以,就有了下面两种初始化方式。
1)动态初始化一:规则二维表
程序员指定数组的长度,后期再赋值,一开始系统会先给定元素默认初始值,规则二维表也就意味着每一行的列数是相同的,其一般格式如下,首先确定行数和列数:
元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
其中m表示这个二维数组有多少个一维数组,或者说二维表一共有几行;n表示每个一维数组的元素有多少个,或者说每行有几个单元格。
此时创建完数组,行数列数确定,而且元素也都有默认值,再为元素赋新值:
二维数组名[行下标][列下标] = 值;
例如:
public class Main { public static void main(String[] args) { int[][] arr = new int[3][2]; /* 定义一个二维数组arr 这个二维数组有3个一维数组的元素 每个一维数组有2个元素 */ System.out.println(arr); //输出二维数组名称 System.out.println(arr[0]); //输出二维数组的第一个元素一维数组的名称 System.out.println(arr[0][0]); //输出二维数组的元素 } }
2)动态初始化二:不规则二维表
不规则二维表也就意味着每一行的列数可能不一样,其一般格式如下,首先确定总行数:
元素的数据类型[][] 二维数组名 = new 元素的数据类型[总行数][];
此时只是确定了总行数,每一行里面现在是null,然后再确定每一行的列数,创建每一行的一维数组:
二维数组名[行下标] = new 元素的数据类型[该行的总列数];
此时通过new的行的元素就有默认值,没有通过new的行还是null,最后为元素赋值:
二维数组名[行下标][列下标] = 值;
注意:不规则二维表,声明后,初始化内部一维数组时不能简写。
//不规则二维表定义二维数组 int[][] arr = new int[3][]; //3行,未知的列 //初始化二维数组内的元素值 arr[0] = new int[]{1}; //此处不能简写为arr[0] = {1} arr[1] = new int[]{2,3}; arr[2] = new int[]{4,5,6};
4.二维数组的遍历
二维数组的遍历和一维数组一样,区别就是,首先要在外循环,遍历每个一维数组,其一般格式如下:
for(int i=0;i<二维数组名.length;i++) { for(int j=0;j<二维数组名[i].length;j++) { System.out.print(二维数组名[i][j]); } System.out.println(); }
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程