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){
}
注意,可变参数和普通参数共存的时候,可边参数必须放到最后一个参数的位置