Java中2數swap問題

Java中2數swap問題

程序中交換2數的值,是一個很常見的問題。由於Java實參傳遞的特點,這個看似簡單的問題處理起來還有些棘手。

先看下面的代碼,有2個整數m,n,打算用swap函數交換它們的值

public class SwapTest2 {
    public static void main(String[] args) {
        int m=3,n=4;
        System.out.println("m is:"+m+",n is:"+n);
        swap(m,n);
        System.out.println("m is:"+m+",n is:"+n);
    }
    static void swap(int a, int b){
        int c;
        c=a;
        a=b;
        b=c;
    }
}

執行結果如下:
m is:3,n is:4
m is:3,n is:4
邏輯似乎沒有問題,然而m,n並未按預期交換,爲什麼?
原因是,簡單變量實參是值傳遞,即m,n傳給a,b的是其值的副本,swap被調用時,內存中將有獨立的兩份3,4,交換方法交換的是a,b的值,而m,n不受影響,所以代碼執行結果不符合預期。

下面是改進的代碼,利用對象傳參是引用傳參的特點,實現了2數的交換

class Number {
    int num1,num2;
    Number(int n1,int n2){
        num1=n1;
        num2=n2;
    }
}

public class SwapTest3 {
    public static void main(String[] args) {
        Number n1 = new Number(3,5);
        Number n2 = new Number(3,5);
        System.out.print("before swap:");
        System.out.println("n1.num1 is:"+n1.num1 + "," + "n2.num2 is:"+n2.num2);
        swap(n1, n2);
        System.out.print("after swap:");
        System.out.println("n1.num1 is:"+n1.num1 + "," + "n2.num2 is:"+n2.num2);
    }

    static void swap(Number m, Number n) {
        int s = m.num1;
        m.num1 = n.num2;
        n.num2 = s;
    }
}

before swap:n1.num1 is:3,n2.num2 is:5
after swap:n1.num1 is:5,n2.num2 is:3

btw:Python中處理此問題,異常簡單。

>>> def swap(a,b):
	a,b=b,a
	return a,b

>>> swap(1,2)
(2, 1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章