Java:为什么这种交换方法不起作用?

Java: Why does this swap method not work?

本问题已经有最佳答案,请猛点这里访问。

我有以下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Main {

    static void swap (Integer x, Integer y) {
        Integer t = x;
        x = y;
        y = t;
    }

    public static void main(String[] args) {
       Integer a = 1;
       Integer b = 2;
       swap(a, b);
       System.out.println("a=" + a +" b=" + b);
    }
}

我希望它打印A=2B=1,但打印的是相反的。所以显然swap方法不交换a和b值。为什么?


这与整数的不可变无关,它与Java通过值的事实有关,该死!(不生气,只是文章的标题:p)

总而言之,你不能用Java来交换一个方法。你只需要自己做交换,无论你需要它在哪里;不管怎样,这只是三行代码,所以不应该有那么大的问题:)

1
2
3
    Thing tmp = a;
    a = b;
    b = tmp;


Java中的所有东西都是通过值传递的,变量的值总是原语或对象的引用。


正如Svish和其他人指出的,它是由价值调用,而不是Java引用。由于爪哇中没有指针,所以需要某种类型的HORD对象来真正地交换值。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
static void swap(AtomicReference<Integer> a, AtomicReference<Integer> b) {

    Integer c = a.get();
    a.set(b.get());
    b.set(c);

}

public static void main(String[] args) {

    AtomicReference<Integer> a = new AtomicReference<Integer>(1);
    AtomicReference<Integer> b = new AtomicReference<Integer>(2);

    System.out.println("a =" + a);
    System.out.println("b =" + b);

    swap(a, b);

    System.out.println("a =" + a);
    System.out.println("b =" + b);

}


如果要实现整数对象的交换方法,则必须将值包装到数组(或arraylist)中,并在数组中进行交换。以下是对您的代码的改编:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Main {

    static void swap (Integer[] values) {
        if ((values == null) || (values.length != 2)) {
          throw new IllegalArgumentException("Requires an array with exact two values");
        }

        Integer t = values[0];
        values[0] = values[1];
        values[1] = t;
    }

    public static void main(String[] args) {
       Integer a = 1;
       Integer b = 2;
       Integer[] integers= new Integer[]{a,b};
       swap(integers);
       System.out.println("a=" + integers[0] +" b=" + integers[1]);
    }
}

(刚刚添加了这个答案,因为sVIH提到,"你不能真的在Java中交换方法"FG)


您需要通过引用传递参数,这在Java中是不可能的。整数也是可变的,因此您不能交换值,因为您没有setvalue方法。


使用扫描仪:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.util.*;
public class Swap {
 public static void main(String[] args){
  int i,temp,Num1,Num2;
  Scanner sc=new Scanner(System.in);
  System.out.println("Enter Number1 and Number2");
  Num1=sc.nextInt();
  Num2=sc.nextInt();
  System.out.println("Before Swapping Num1="+Num1+" Num2="+Num2);
  temp=Num1;
  Num1=Num2;
  Num2=temp;
  System.out.println("After Swapping Num1="+Num1+" Num2="+Num2);
 }    
}


Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class swap {

    int n1;
    int n2;
    int n3;

    void valueSwap() {
        n3 = n1;
        n1 = n2;
        n2 = n3;
    }

    public static void main(String[] arguments) {

        Swap trial = new Swap();
        trial.n1 = 2;
        trial.n2 = 3;

        System.out.println("trial.n1 =" + trial.n1);
        System.out.println("trial.n2 =" + trial.n2);

        trial.valueSwap();

        System.out.println("trial.n1 =" + trial.n1);
        System.out.println("trial.n2 =" + trial.n2);

    }
}

输出:

1
2
3
4
trial.n1 = 2
trial.n2 = 3
trial.n1 = 3
trial.n2 = 2

使用XOR运算符是一个非常糟糕的主意:

首先,它的可读性要差得多。第二,有时速度更快,但现在情况恰恰相反。见

维基百科

供参考。


因为所有的人都提到这是一个超值的东西。

只是喜欢加:您可以使用这个交换全局整数的方法。

1
2
3
4
5
private void swap (){
     a ^= b;
     b ^= a;
     a ^= b;
}

它消除了另一个变量的使用,它只是更酷而已:)


整数是不可变的-不能更改它们的值。交换函数内部发生的交换是对引用的交换,而不是对值的交换。

您需要返回数组中的两个引用,以实现您想要的结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static Integer[] swap(Integer a, Integer b) {
   return new Integer[]{b, a};
}

public static void main(String[] args) {
   Integer a = 1;
   Integer b = 2;

   Integer[] intArray = swap(a, b);

   a = intArray[0];
   b = intArray[1];

   System.out.println("a=" + a +" b=" + b);
}

如果integer有setvalue方法,可以这样做。

1
2
3
4
5
static void swap(Integer a, Integer b) {
   int temp = a.intValue();
   a.setValue(b.intValue());
   b.setValue(temp);
}

但它没有-所以为了实现你想要的,返回一个数组。