2、二维数组

2.1、简单概述

二维数组就在一维数组中存放多个一维数组,可以将二维数组看成一个大盒子,里面放着很多小盒子(一维数组)

  • 二维数组在jvm中的存放的时一维数组对象,在堆空间中二维数组开辟来连续的内存空间存放一维数组对象,而一维数组对象指向相对应的一维数组内存。
  • 任何一个一维数组,再加上一对中括号[],就是二维数组

2.2、声明和创建

int[][] a = new int [4][3];

int[][] a = new int [4][];

int[][] a = {
        {0,0,0,1},
        {0,0},
        {0,0,0},
        {0}
};

可以看出长度需要在创建二维数组的时候确定,但二维数组中的每一个一维数组的长度可以不相同。

2.3、赋值与取值

int[][] a = new int[3][];//三层楼
//为每一个一维数组确定长度
a[0] = new int[1];//第一层楼,1间房 
a[1] = new int[2];//第二层楼,2间房
a[2] = new int[3];//第三层楼,3间房


//具体到相应的下标进行赋值
a[0][0] = 10; //第一层楼,第一间房,存放数据

a[1][0] = 20; //第二层楼,第一间房,存放数据
a[1][1] = 20; //第二层楼,第二间房,存放数据

a[2][0] = 30; //第三层楼,第一间房,存放数据
a[2][1] = 30; //第三层楼,第二间房,存放数据
a[2][2] = 30; //第三层楼,第三间房,存放数据

取值的方式就是定义一个变量接收相应数组下标的元素。

二维数组遍历和一维数组类似。

2.4、杨辉三角

public class YangHuiTriangle {

/*  首尾都为一
 *     1        第一层一个元素   4个空格   
 *    1 1       第二层两个元素   3个空格 
 *   1 2 1      第三层三个元素   2个空格 第三层第二个元素等于第二层的第一个元素和最后一个元素相加
 *  1 3 3 1     第四层四个元素   1个空格
 * 1 4 6 4 1    第五层五个元素   0个空格
 *  arr[2][1] = arr[1][0]+arr[1][1]
 *  arr[i][j] = arr[i-1][j-1]+arr[i-1][j]
 * */
	public static void main(String[] args) {
		// 定义一个二维数组
		int[][] arr = new int[5][];
		//外层循环 遍历层数
		for(int i = 0;i<arr.length;i++) {
			//声明二维数组中每个一维数组的元素个数
			arr[i]=new int[i+1];
			//打印空格
			for(int j = i;j<arr.length;j++) {
				System.out.print(" ");
			}
			//打印需要输出的内容
			for(int k = 0;k<=i;k++) {
				//第一个元素和最后一个元素,赋值为1
				if(k==0||k==i) {
					arr[i][k]=1;
					System.out.print(arr[i][k]+" ");
				}else {
					//为其他元素赋值 arr[i][j] = arr[i-1][j-1]+arr[i-1][j]
					arr[i][k]=arr[i-1][k-1]+arr[i-1][k];
					System.out.print(arr[i][k]+" ");
				}
			}
			//换行
			System.out.println();
		}
		
	}

}

2.5、可变参数

例如,假设有这个一个方法,参数 int[] 类型

public void test(int[] a){
	//...	
}

./在调用这个方法的时候,【只能】传一个数组对象作为参数
int[] arr = {1,2,3};
t.test(arr);

例如,如果使用可变参数的语法,上面的方法就可以变成下面的情况:

public void test(int... a){

}

//在调用这种方法的时候,我们所传的参数情况就可以有多种选择了
int[] arr = {1,2,3};

t.test();
t.test(1);
t.test(1,2,3,4);
t.test(arr);

在test方法中,这个可变参数a,其实就是一个int类型的数组,在方法中可以直接把a当做数组来使用。

如果没有传任何参数,那么这个数组a的长度就是0

如果传1个参数,那么数组a的长度是1,数组里面的数据就是所传的参数。

依次类推,传多个参数的情况也是类似的。

额外的,还可以把一个数组当做参数传进来,因为这个可变参数a,本来就是一个数组。

例如,方法中有一个可变参数同时,还可以有其他普通的参数

public void test(String str,int... a){
		
}

注意,可变参数和普通参数共存的时候,可边参数必须放到最后一个参数的位置