Java中函數參數是按值傳遞的,在實現數組元素互換位置之前,我想先說一下Java函數參數傳遞過程。一般情況下我們會把參數分為基本數據類型和引用數據類型,然后分別來講參數傳遞,因為他們的外在表現似乎是不同的,然而,他們的本質都是值傳遞。在講值傳遞時,請務必將“實參的副本”這五個字刻在腦海,因為它是理解值傳遞的關鍵。
// 例子1
int a = 0;
void value(int x) {
x = 1;
}
value(a);
System.out.println(a); // 結果是 0
// 例子2
StringBuilder a = new StringBuilder("iphone");
void value(StringBuilder str) {
str.append("7");
}
value(a);
System.out.println(a.toString()); // 結果是 iphone7
從上面的結果可以看到,第一個例子值沒有變,因為只是給a的副本賦新值,a的值沒有變化。
第二個例子a是引用,a的副本和a指向同一塊內存地址,所以調用函數是內存地址中的值發生了變化,所以a所指向的內存地址中的值發生了變化。我們那個打印函數打印的是a所指向的內存地址中的值,而不是a本身,a本身還是不變的。
下面是實現數組元素互換的代碼,我們自己試着理解一下:
// 交換兩個元素
private void exchange(int[] nums, int x, int y) {
int temp = nums[x];
nums[x] = nums[y];
nums[y] = temp;
}
這里調用函數時,具體操作的是nums,x和y的副本,但是由於nums副本和nums都指向同一塊地址,所以當函數內部對副本所指向的內存中的值進行操作時,nums所指向的內存中的值也是變化的,而nums這個引用本身是不變的。也就是說,nums中的值(內存地址,如0x0029)不變。