大可制作:QQ群:31564239(asp|jsp|php|mysql)

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