数组本身就是一种数据类型,它用以存储数据。数组可以存储的数据类型有:int型、double型、char型等等不同的基本数据类型。但一个数组只能存储一种数据类型。
二维数组是我们经常接触到的数组,多维数组我们有时也会接触。
在此我以int型数据类型作为实例讲解二维数组、多维数组的输入方法以及数组的复制。
(一)、数组的输入:
数组的输入输出方法我们一般有两种,一种是在main()方法中定义一个数组,然后将其输出,还有一种是利用控制台输入数组,再将其输出。
A、main()方法操作
我们在main()方法中输入如下代码:
int a[] = new int[] { 1, 2, 5, 4, 3 };
System.out.println(Arrays.toString(a));
int[][] array = new int[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
System.out.println(Arrays.deepToString(array));
运行结果:
[1, 2, 5, 4, 3]
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
Arrays类中提供了将数组转换为String类型输出的方法,这种方法能够让数组元素以数据“集合”的方式输出,而不用以元素方式一个一个地输出,但二维数组采用的是toString()方法,而多维数组采用的是deepToString()方法。
B、控制台操作
控制台输入法我们一般调用Scanner()类,然后利用for() { }循环控制。
我们在main()方法中输入如下代码:
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组的元素个数:");
int count = scanner.nextInt();
int a[] = new int[count];
System.out.println("请输入数组元素:");
for (int b = 0; b < count; b++) {
a[b] = scanner.nextInt();
}
System.out.println(Arrays.toString(a));
在控制台中我们根据提示进行操作,最后控制台中会显示我们的输入信息以及通过main()方法执行后的结果:
请输入数列的项数:
5
请输入数组元素:
1
2
5
4
3
[1, 2, 5, 4, 3]
这段代码我们先通过输入的数字确定了这段数组的元素个数,利用元素个数确定数组的长度,然后通过for() { }循环分别向数组中相应的位置赋值,最后再以转换为String类型的数组输出。
这里有一点要注意,数组是从“位置1”开始计数的,而JAVA语言是从“位置0”开始计数的,因此数组{1,2,3,4,……,n}在JAVA语言中应当转换为数组{0,1,2,3,……,n-1},否则会报错。
这是二维数组的输入方式,多维数组稍有不同。
多维数组也可以通过控制台输入,但每一维的数组长度都要定义。
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数组的组数:");
int lengthHang = scanner.nextInt();
System.out.println("请输入每组数组的元素个数:");
int lengthLie = scanner.nextInt();
int[][] array = new int[lengthHang][lengthLie];
System.out.println("请输入数组元素:");
for (int a = 0; a < lengthHang; a++) {
for (int b = 0; b < lengthLie; b++) {
array[a][b] = scanner.nextInt();
}
}
System.out.println(Arrays.deepToString(array));
在控制台中我们同样根据提示进行操作,最后控制台中会显示我们的输入信息以及通过main()方法执行后的结果:
请输入数组的组数:
3
请输入每组数组的元素个数:
4
请输入数组元素:
1
2
3
4
5
6
7
8
9
10
11
12
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
我们来观察这两种数组,可以看得出来,二维数组的定义方式为:数组名[元素个数],多维数组的定义方式为:数组名[数组组数][元素个数]。
(二)、数组的复制
我们依旧使用上述两个数组:
int a[] = new int[] { 1, 2, 5, 4, 3 };
int[][] array = new int[][] { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
我们先来看看二维数组的复制:
我们在main()方法中输入如下代码:
int a[] = new int[] { 1, 2, 5, 4, 3 };
System.out.println(Arrays.toString(a));
int d[] = Arrays.copyOf(a, 0);
System.out.println("Arrays.copyOf(a, 0) : " + Arrays.toString(d));
d = Arrays.copyOf(a, 1);
System.out.println("Arrays.copyOf(a, 1) : " + Arrays.toString(d));
d = Arrays.copyOf(a, a.length - 2);
System.out.println("Arrays.copyOf(a, a.length - 2) : " + Arrays.toString(d));
d = Arrays.copyOf(a, a.length - 1);
System.out.println("Arrays.copyOf(a, a.length - 1) : " + Arrays.toString(d));
d = Arrays.copyOf(a, a.length);
System.out.println("Arrays.copyOf(a, a.length) : " + Arrays.toString(d));
d = Arrays.copyOf(a, a.length + 1);
System.out.println("Arrays.copyOf(a, a.length + 1) : " + Arrays.toString(d));
d = Arrays.copyOf(a, a.length + 2);
System.out.println("Arrays.copyOf(a, a.length + 2) : " + Arrays.toString(d));
d = Arrays.copyOfRange(a, 0, a.length);
System.out.println("Arrays.copyOfRange(a, 0, a.length) : " + Arrays.toString(d));
d = Arrays.copyOfRange(a, 2, a.length);
System.out.println("Arrays.copyOfRange(a, 2, a.length) : " + Arrays.toString(d));
d = Arrays.copyOfRange(a, 1, a.length - 2);
System.out.println("Arrays.copyOfRange(a, 1, a.length - 2) : " + Arrays.toString(d));
d = Arrays.copyOfRange(a, 1, a.length + 2);
System.out.println("Arrays.copyOfRange(a, 1, a.length + 2) : " + Arrays.toString(d));
运行结果:
[1, 2, 5, 4, 3]
Arrays.copyOf(a, 0) : []
Arrays.copyOf(a, 1) : [1]
Arrays.copyOf(a, a.length - 2) : [1, 2, 5]
Arrays.copyOf(a, a.length - 1) : [1, 2, 5, 4]
Arrays.copyOf(a, a.length) : [1, 2, 5, 4, 3]
Arrays.copyOf(a, a.length + 1) : [1, 2, 5, 4, 3, 0]
Arrays.copyOf(a, a.length + 2) : [1, 2, 5, 4, 3, 0, 0]
Arrays.copyOfRange(a, 0, a.length) : [1, 2, 5, 4, 3]
Arrays.copyOfRange(a, 2, a.length) : [5, 4, 3]
Arrays.copyOfRange(a, 1, a.length - 2) : [2, 5]
Arrays.copyOfRange(a, 1, a.length + 2) : [2, 5, 4, 3, 0, 0]
我们先来观察上半部分的代码和运行结果,数组复制的语法为:Arrays.copyOf(原数组, 新长度);。它以原数组及其长度(元素个数)为基础:新长度为0,输出空数组;不超过其长度的新数组“符合”原数组的“输出规矩”,从原数组“1号”元素开始,直至输完新长度的元素为止;超过其长度的新数组将原数组输出之后,再以0逐个补全超过原长度的每个号(位置),当然不同的数据类型会以不同的方式补全。
我们再来观察下半部分的代码和运行结果,数组复制的语法为:Arrays.copyOfRange(原数组, 起始位置, 终止位置),它与上述复制方法是有所区别的,上半部分的新长度其实是“元素个数”,新的非空数组的起始位置为1;而下半部分的起始位置是从0开始计算的,它从起始位置开始输出,输出的个数为(终止位置 - 起始位置),超出的部分同样以0补全。
多维数组的复制:
int[][] a = new int[][] { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };
System.out.println(Arrays.deepToString(a));
int d[][] = Arrays.copyOf(a, 0);
System.out.println("Arrays.copyOf(a, 0) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, 1);
System.out.println("Arrays.copyOf(a, 1) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, a.length - 2);
System.out.println("Arrays.copyOf(a, a.length - 2) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, a.length - 1);
System.out.println("Arrays.copyOf(a, a.length - 1) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, a.length);
System.out.println("Arrays.copyOf(a, a.length) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, a.length + 1);
System.out.println("Arrays.copyOf(a, a.length + 1) : " + Arrays.deepToString(d));
d = Arrays.copyOf(a, a.length + 2);
System.out.println("Arrays.copyOf(a, a.length + 2) : " + Arrays.deepToString(d));
d = Arrays.copyOfRange(a, 1, 1);
System.out.println("Arrays.copyOfRange(a, 1, 1) : " + Arrays.deepToString(d));
d = Arrays.copyOfRange(a, 1, 2);
System.out.println("Arrays.copyOfRange(a, 1, 2) : " + Arrays.deepToString(d));
d = Arrays.copyOfRange(a, 1, 3);
System.out.println("Arrays.copyOfRange(a, 1, 3) : " + Arrays.deepToString(d));
d = Arrays.copyOfRange(a, 1, 4);
System.out.println("Arrays.copyOfRange(a, 1, 4) : " + Arrays.deepToString(d));
运行结果:
[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Arrays.copyOf(a, 0) : []
Arrays.copyOf(a, 1) : [[1, 2, 3]]
Arrays.copyOf(a, a.length - 2) : [[1, 2, 3]]
Arrays.copyOf(a, a.length - 1) : [[1, 2, 3], [4, 5, 6]]
Arrays.copyOf(a, a.length) : [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
Arrays.copyOf(a, a.length + 1) : [[1, 2, 3], [4, 5, 6], [7, 8, 9], null]
Arrays.copyOf(a, a.length + 2) : [[1, 2, 3], [4, 5, 6], [7, 8, 9], null, null]
Arrays.copyOfRange(a, 1, 1) : []
Arrays.copyOfRange(a, 1, 2) : [[4, 5, 6]]
Arrays.copyOfRange(a, 1, 3) : [[4, 5, 6], [7, 8, 9]]
Arrays.copyOfRange(a, 1, 4) : [[4, 5, 6], [7, 8, 9], null]
我们先来观察上半部分的代码和运行结果,数组复制的语法为:Arrays.copyOf(原数组, 新长度);。它以原数组及其长度(数组组数)为基础:新长度为0,输出空数组;不超过其长度的新数组“符合”原数组的“输出规矩”,从原数组“1号小组”元素开始,直至输完新长度的组数为止;超过其长度的新数组将原数组输出之后,再以null逐个补全超过原长度的每个号(小组)。二维数组以元素为单位,所以用0补全,多维数组中以小组为单位,所以是用null而不是用0补全。
我们再来观察下半部分的代码和运行结果,数组复制的语法为:Arrays.copyOfRange(原数组, 起始位置, 终止位置),它与上述复制方法是有所区别的,上半部分的新长度其实是“组数”,新的非空数组的起始位置为1;而下半部分的起始位置是从0开始计算的,它从起始位置开始输出,输出的组数为(终止位置 - 起始位置),超出的部分同样以null补全。