1. 程式人生 > >實現數組元素互換位置(乘機理解java參數傳遞)

實現數組元素互換位置(乘機理解java參數傳遞)

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參數傳遞)