Java中2数swap问题

Java中的2数交换问题

2数交换是程序中一个很常见的问题,由于Java实参传递的特点,这个看似简单的问题在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)

你可能感兴趣的:(Java)