實現數組元素互換位置(乘機理解java參數傳遞)
阿新 • • 發佈:2018-01-10
int end sys 過程 函數 pre phone 就是 gpo
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)不變。
實現數組元素互換位置(乘機理解java參數傳遞)