数组传递给方法

数组的复制

在说数组传递给方法之前先扯一下数组的复制。一开始想进行数组的复制时,我丝毫没有犹豫的使用了赋值语句。

array1 = array2;

这样做 array1 的值的确和 array2 的内容一样了,但这并没有把 array2 的内容复制给 array1(这句话好绕啊)。

Java 中,可以使用赋值语句来复制基本数据类型的变量,但不能复制数组。将一个数组变量赋值给另一个数组变量,实际上是将一个数组的引用赋值给另一个数组。例如上面那条语句,实际上是将 array2 的引用值复制给了 array1,此时 array1 也指向了 array2 的内容,这样就没有指向原先 array1 的内容的了,原先 array1 的内容也无法引用了,就变成了垃圾,java 虚拟机将会自动收回。并且改变 array1 或 array2 任意一个的内容,两者的内容都会发生改变,因为它们是指向内存中同一个地方的。

所以如果要进行数组的复制的话据我所知有三种方法:

  1. 使用循环语句逐个复制数组的元素。
  2. 使用 System 类中的静态方法 arraycopy。
  3. 使用 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 = 2

before swapElement
array is {1, 2}
after swapElement
array is {2, 1}

可见数组传递给方法的是数组的引用值