ITEEDU

Java Gossip: 进阶的数组观念

藉由对数组对象的进一步探讨,您可以稍微了解Java对对象处理的一些作法,首先来看看一个一维数组参考名称的宣告:

int[] arr; 

在这个宣告中,arr表示一个可以参考至一维数组对象的名称,但是目前还没有指定它参考至任何的对象,在Java中,=运算子用于基本数据型态时,是 将值复制给变量,但当它用于对象时,则是将对象指定给参考名称来参考,您也可以将同一个对象指定给两个参考名称,当对象的值藉由其中一个参考名称变更 时,另一个参考名称所参考到的值也会更动,使用下面的程序来作示范:

AdvancedArray.java
public class AdvancedArray {
	public static void main(String[] args) {
		int[] arr1 = {1, 2, 3, 4, 5};
		int[] tmp1;
		int[] tmp2;
		tmp1 = arr1;
		tmp2 = arr1;
		for(int i = 0; i < tmp1.length; i++)
		System.out.print(tmp1[i] + " ");
		System.out.println();
		for(int i = 0; i < tmp2.length; i++)
		System.out.print(tmp2[i] + " ");
		System.out.println();
		tmp1[2] = 9;
		for(int i = 0; i < tmp1.length; i++)
		System.out.print(tmp1[i] + " ");
		System.out.println();
		for(int i = 0; i < tmp2.length; i++)
		System.out.print(tmp2[i] + " ");
		System.out.println();
	}
}

执行结果:

1 2 3 4 5 
1 2 3 4 5 
1 2 9 4 5 
1 2 9 4 5?

在这个范例中,您藉由tmp1名称改变了索引2的元素值,所以tmp2所参考到的索引2的元素值也会改变,事实上在这个程序中,有三个参考名称参考至同一 个数组对象,也就是arr1、tmp1与tmp2,所以您应该也知道,arr1索引2的值在程序执行后所参考到的值也改变了。

在宣告int[] arr之后,arr表示它是一个一维数组对象的参考名称,所以它可以参考至任何长度的一维数组对象,使用下面这个例子来说明:

AdvancedArray.java
public class AdvancedArray {
	public static void main(String[] args) {
		int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = {5, 6, 7};
		int[] tmp;
		tmp = arr1;
		for(int i = 0; i < tmp.length; i++)
		System.out.print(tmp[i] + " ");
		System.out.println();
		tmp = arr2;
		for(int i = 0; i < tmp.length; i++)
		System.out.print(tmp[i] + " ");
		System.out.println();
	}
}

执行结果:

1 2 3 4 5 
5 6 7 

在上面的程序中,tmp可以参考至5个元素的一维数组,也可以参考至3个元素的一维数组。

您了解到在Java中数组是一个对象,而使用 = 指定时是将对象指定给数组名来参考,而不是数组复制,如果您想将整个数组的值复制给另一个数组该如何作呢?您可以使用循环,将整个数组的元素值走访一遍,并指定给另一个数组相对应的索引位置,例如下面这个例子:

AdvancedArray.java
public class AdvancedArray {
	public static void main(String[] args) {
		int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = new int[5];
		for(int i = 0; i < arr1.length; i++)
		arr2[i] = arr1[i];
		for(int i = 0; i < arr2.length; i++)
		System.out.print(arr2[i] + " ");
		System.out.println();
	}
}

执行结果:

1 2 3 4 5 

另一个更简便的方法是使用System类别所提供的静态方法arraycopy(),其语法如下:

System.arraycopy(来源, 起始索引, 目的, 起始索引, 复制长度);


下面这个程序是个示范:

AdvancedArray.java

public class AdvancedArray {
	public static void main(String[] args) {
		int[] arr1 = {1, 2, 3, 4, 5};
		int[] arr2 = new int[5];
		System.arraycopy(arr1, 0, arr2, 0, arr1.length);
		for(int i = 0; i < arr2.length; i++)
		System.out.print(arr2[i] + " ");
		System.out.println();
	}
}

执行结果:

1 2 3 4 5