学习任务:

视频学习二维数组定义

动手测试程序理解二维数组的内存结构

动手测试二维数组定义的方法

二维数组是一维数组的升级版本,二维数组可以存储多个一维数组,如果把一维数组理解为一行多列,二维数组就是多行多列。

下图是二维数组的内存结构图:

image-20210120100720925

分析如下:

在main方法中定义二维数组datas,datas是二维数组的引用变量。

二维数组是由多个一维数组组成,每个一维数组可以看成是一行,有几个一维数组就有几行。

每行的一维数组的起始地址即每行一维数组的引用存在单独一个一维数组中,见上图。

上图中,每行一维数组的起始地址分别为0x0010、0x0020、0x0030。起始地址为0x0001的一维数组存储了每一行数组的地址,main方法中二维数组引用 变量datas存储 了0x0001地址。

代码测试 :

import java.util.Random;

/**
 * 	面向过程编程-二维数组-定义
 * 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Array2Demo1 {

	
	//测试二维数组的内存结构
	public static void test1() {
		//定义二维数组,共3个一维数组,每个一维数组4个元素
    	int[][] datas = new int[3][4];
    	//datas的值指向用于存储一维数组地址的一维数组
    	System.out.println(datas);
    	//datas[0]的值为第1个一维数组的地址
    	System.out.println(datas[0]);
    	//datas[1]的值为第2个一维数组的地址
    	System.out.println(datas[1]);
    	//datas[2]的值为第3个一维数组的地址
    	System.out.println(datas[2]);
    	
    	//datas[0][0]为第1个一维数组第1个元素的值,初始值为0
    	System.out.println(datas[0][0]);
    	//datas[0][1]为第1个一维数组第2个元素的值,初始值为0
    	System.out.println(datas[0][1]);
    	//datas[0][2]为第1个一维数组第3个元素的值,初始值为0
    	System.out.println(datas[0][2]);
    	//datas[0][3]为第1个一维数组第4个元素的值,初始值为0
    	System.out.println(datas[0][3]);
    	//datas[0][4]数组下标越界,报错
    	//System.out.println(datas[0][4]);
	}
	
	public static void main(String[] args) {
		test1();
    }
    
}

二维数组的定义方式有很多种,如下:

第一种:

数据类型[][] 数组名 = new 数据类型[i][j]; 或 数据类型[] 数组名[] = new 数据类型[i][j]; 建议第一种格式。 i:表示这个二维数组有多少个一维数组即行数。 j:表示每个一维数组的元素个数即列数。 例子: //定义两个数组,x为一维数组,y为二维数组 int[] x,y[]; //为数组分配空间并初始化 x = new int[2]; y = new int[2][3]; //定义3行4列二维数组 int[][] z = new int[3][4];

第二种:

数据类型[][] 数组名 = new 数据类型[i][];
	
i:表示这个二维数组有多少个一维数组即行数。
列数没有指定说明每个一维数组的元素个数可以不一样,可以动态指定.
例子:
//仅指定行数
int[][] b = new int[3][];
//给每行指定不同的一维数组,且数组长度可不一样
b[0] = new int[3];
b[1] = new int[2];
b[2] = new int[1];
System.out.println(b[0][2]);
//第二行的元素个数为2,下边代码获取第2行第3列的元素,最终下标越界
//System.out.println(b[1][2]);

第三种:

二维数组的静态初始化方法如下:

数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
或
数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
例子:
//静态初始化
int[][] m = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
int[][] n = {{1,2,3,4},{5,6},{7,8,9}};
//输出数组的行数
System.out.println(m.length);
System.out.println(n.length);
//输出m数组第1行的元素个数
System.out.println(m[0].length);
//输出n数组第1行的元素个数
System.out.println(n[0].length);
//输出n数组第2行的元素个数
System.out.println(n[1].length);
输出:
3
3
4
4
2

完整代码如下:

import java.util.Random;

/**
 * 	面向过程编程-二维数组-定义
 * 
 * @author 攀博课堂(www.pbteach.com)
 *
 */
public class Array2Demo1 {

	
	//测试二维数组的内存结构
	public static void test1() {
		//定义二维数组,共3个一维数组,每个一维数组4个元素
    	int[][] datas = new int[3][4];
    	//datas的值指向用于存储一维数组地址的一维数组
    	System.out.println(datas);
    	//datas[0]的值为第1个一维数组的地址
    	System.out.println(datas[0]);
    	//datas[1]的值为第2个一维数组的地址
    	System.out.println(datas[1]);
    	//datas[2]的值为第3个一维数组的地址
    	System.out.println(datas[2]);
    	
    	//datas[0][0]为第1个一维数组第1个元素的值,初始值为0
    	System.out.println(datas[0][0]);
    	//datas[0][1]为第1个一维数组第2个元素的值,初始值为0
    	System.out.println(datas[0][1]);
    	//datas[0][2]为第1个一维数组第3个元素的值,初始值为0
    	System.out.println(datas[0][2]);
    	//datas[0][3]为第1个一维数组第4个元素的值,初始值为0
    	System.out.println(datas[0][3]);
    	//datas[0][4]数组下标越界,报错
    	//System.out.println(datas[0][4]);
	}
	
	//测试二维数组的定义
	public static void test2() {
		//定义两个数组,x为一维数组,y为二维数组
    	int[] x,y[];
    	//为数组分配空间并初始化
    	x = new int[2];
    	y = new int[2][3];
    	//定义3行4列二维数组
    	int[][] z = new int[3][4];
    	
    	//仅指定行数
    	int[][] b = new int[3][];
    	//给每行指定不同的一维数组,且数组长度可不一样
    	b[0] = new int[3];
    	b[1] = new int[2];
    	b[2] = new int[1];
    	System.out.println(b[0][2]);
    	//第二行的元素个数为2,下边代码越界
    	//System.out.println(b[1][2]);
    	
    	//静态初始化
		int[][] m = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
		int[][] n = {{1,2,3,4},{5,6},{7,8,9}};
		//输出数组的行数
		System.out.println(m.length);
		System.out.println(n.length);
		//输出m数组第1行的元素个数
		System.out.println(m[0].length);
		//输出n数组第1行的元素个数
		System.out.println(n[0].length);
		//输出n数组第2行的元素个数
		System.out.println(n[1].length);
	}
	
	public static void main(String[] args) {
		test2();
    }
    
}

输出:

0
3
3
4
4
2
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题