二维数组
如果把普通的数组(一维数组),看作一个小盒子的话,盒子里面可以存放很多数据,那么二维数组就是像一个大点的盒子,里面可以存放很多小盒子(一维数组)。
1 定义格式
二维数组固定定义格式有2种,具体如下:
格式1:
数据类型[][] 数组名 = new 数据类型[一维长度m][二维长度n];
m:表示二维数组的元素数量,即可以存放多少个一维数组
n:表示每一个一维数组,可以存放多少个元素
格式2:
数据类型[][] 数组名 = new 数据类型[一维长度][];
案例展示:
package com.briup.chap04;
import java.util.Arrays;
public class Test091_Basic {
public static void main(String[] args) {
//一维长度2,代表这个二维数组里面包含2个元素,每个元素都是一个一维数组
//二维长度3,代表这个二维数组中元素,类型都是int[3]的一维数组,存放3个int数据
int[][] arr = new int[2][3];
/*
[[I@15db9742
[[: 2个中括号就代表的是2维数组
I: 数组中存储的数据类型为int
15db9742: 十六进制内存地址
*/
System.out.println(arr);
//二维数组的每个元素值(第一维), 对应的是一维数组的内存地址值
System.out.println(arr[0]); //[I@15db9742
System.out.println(arr[1]); //[I@6d06d69c
System.out.println("--------------");
//第二种定义格式
int[][] arr2 = new int[2][];
//输出arr2中2个元素值,默认为null、null
System.out.println(Arrays.toString(arr2));
//给二维数组的每个元素赋值
//arr[0] = new int[2];
//arr[1] = new int[3];
}
}
2 内存结构
一维数组内存结构:
二维数组内存结构:
可以把二维数组看成一个一维数组,数组的每个元素对应的内存区域中,存放的是一维数组引用值,具体可参考下面2个图:
3 元素访问
二维数组中元素的访问和赋值,也是通过数组下标实现的。
书写格式:
二维数组名[一维下标m][二维下标n];
例如:int arr[2][3];
注意:m、n的取值都是[0,length-1]
,注意不要越界,否则会出现异常ArrayIndexOutOfBoundsException
。
案例展示:
package com.briup.chap04;
public class Test093_Access {
public static void main(String[] args) {
// 数据类型[][] 变量名 = new 数据类型[m][n];
int[][] arr = new int[2][3];
//获取二维数组元素值并输出
System.out.println(arr[0][0]);
System.out.println(arr[1][1]);
System.out.println("-----------");
// 向二维数组中存储元素
arr[0][0] = 11;
arr[0][1] = 22;
arr[0][2] = 33;
arr[1][0] = 11;
arr[1][1] = 22;
arr[1][2] = 33;
//arr[2][0] = 3; 数组越界异常
// 3. 遍历二维数组,获取所有元素,累加求和
for (int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
4 初始化
二维数组的静态初始化,有点类似一维数组的初始化,具体格式如下:
完整格式 :
数据类型[][] 数组名 = new 数据类型[][]{ {元素1, 元素2...} , {元素1, 元素2...}, ...};
简化格式 :
数据类型[][] 数组名 = { {元素1, 元素2...} , {元素1, 元素2...} ...};
案例:
package com.briup.chap04;
public class Test094_Init {
//封装二维数组遍历方法
public static void outArray(int[][] arr) {
// 遍历二维数组,获取所有元素,累加求和
for (int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void main(String[] args) {
//第一种:完整格式
int[][] arr1 = new int[][]{{1,2,3},{4,5}};
outArray(arr1);
System.out.println("----------");
//第二种:简化格式
int[][] arr2 = {{11, 22, 33}, {44, 55}};
outArray(arr2);
System.out.println("----------");
//第三种:建议从内存角度理解
int[] arr3 = {11, 33};
int[] arr4 = {44, 55, 66};
int[][] array = {arr3, arr4};
outArray(array);
}
}
5 综合案例
案例1:二维数组元素遍历
//上面案例已经使用
public static void outArray(int[][] arr) {
// 遍历二维数组,获取所有元素,累加求和
for (int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++){
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
案例2:二维数组元素求和
package com.briup.chap04;
public class Test095_Sum {
public static void main(String[] args) {
// 1. 定义求和变量,准备记录最终累加结果
int sum = 0;
// 2. 使用二维数组来存储数据
int[][] arr = new int[3][];
arr[0] = new int[]{10};
arr[1] = new int[]{20,20};
arr[2] = new int[]{30,30,30};
//思考,下面一行代码是否正确
//arr[2] = {30,30,30};
// 3. 遍历二维数组,获取所有元素,累加求和
for (int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++){
sum += arr[i][j];
}
}
// 4. 输出最终结果
System.out.println(sum);
}
}
案例3:创建杨辉三角并输出
使用二维数组,打印输出杨辉三角,效果如下:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
具体实现:
package com.briup.chap04;
public class Test095_Triangle {
public static void main(String[] args) {
//1.定义2维数组
int[][] arr = new int[5][5];
//2.给二维数组赋值,得到杨辉三角
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
//a.j==0 第一列都为 1
if(j == 0)
arr[i][j] = 1;
else if(i == j) {
//b. 行和列相同 设置1
arr[i][j] = 1;
}else if(i > j) {
//c. 当前位置值 == 上一行相同列 + 上一行前一列
arr[i][j] = arr[i-1][j] + arr[i-1][j-1];
}
}
}
//3.遍历二维数组,输出杨辉三角
for(int i = 0; i < arr.length; i++) {
for(int j = 0; j < arr[i].length; j++) {
//只输出 左下部分,右上部分0值不输出
if(i >= j)
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
}
}