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)