数组传递给方法
数组的复制
在说数组传递给方法之前先扯一下数组的复制。一开始想进行数组的复制时,我丝毫没有犹豫的使用了赋值语句。
array1 = array2;
这样做 array1 的值的确和 array2 的内容一样了,但这并没有把 array2 的内容复制给 array1(这句话好绕啊)。
Java 中,可以使用赋值语句来复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用赋值给另一个数组。例如上面那条语句,实际上是将 array2 的引用值复制给了 array1,此时 array1 也指向了 array2 的内容,这样就没有指向原先 array1 的内容的了,原先 array1 的内容也无法引用了,就变成了垃圾,java 虚拟机将会自动收回。并且改变 array1 或 array2 任意一个的内容,两者的内容都会发生改变,因为它们是指向内存中同一个地方的。
所以如果要进行数组的复制的话据我所知有三种方法:
- 使用循环语句逐个复制数组的元素。
- 使用 System 类中的静态方法 arraycopy。
- 使用 clone 方法复制数组。
数组传递给方法
和上面用赋值语句复制数组一样,数组传递给方法的也是数组的引用值。
所以和传递基本数据类型的变量不同,方法中对数组进行的修改在方法结束后这些修改还是保留的,因为方法中的数组和方法外的那个数组指向内存中同一块地方。下面的代码就很好的体现了这一特点。
public class Test {
public static void main(String[] args) {
int a = 1, b = 2;
int[] array = {1, 2};
System.out.println("before swapInt");
System.out.println("a = " + a + "\tb = " + b);
swapInt(a, b);
System.out.println("after swapInt");
System.out.println("a = " + a + "\tb = " + b);
System.out.println("\nbefore swapElement");
System.out.println("array is {" + array[0] + ", " + array[1] + "}");
swapElement(array);
System.out.println("after swapElement");
System.out.println("array is {" + array[0] + ", " + array[1] + "}");
}
public static void swapInt(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static void swapElement(int[] array) {
int temp = array[0];
array[0] = array[1];
array[1] = temp;
}
}
输出结果为
before swapInt
a = 1 b = 2
after swapInt
a = 1 b = 2before swapElement
array is {1, 2}
after swapElement
array is {2, 1}
可见数组传递给方法的是数组的引用值