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

时间:2010-01-11 11:42:47

标签: java

我有以下代码:

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 = 2 b = 1,但打印相反。显然交换方法不会交换a和b值。为什么呢?

10 个答案:

答案 0 :(得分:50)

这与整数的不变性无关;它与Java is Pass-by-Value, Dammit! 这一事实有关(不烦恼,只是文章的标题:p)

总结一下:你无法在Java中实现交换方法。您只需自己进行交换,无论您需要它;这只是三行代码,所以不应该是一个很大的问题:)

    Thing tmp = a;
    a = b;
    b = tmp;

答案 1 :(得分:9)

Java中的所有内容都是按值传递的,变量的值始终是基元或对象的引用。

答案 2 :(得分:3)

正如Svish和其他人指出的那样,它是按价值来呼唤的,而不是通过Java引用。由于Java中没有指针,因此需要某种持有者对象才能以这种方式交换值。例如:

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);

}

答案 3 :(得分:2)

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

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]);
    } 
}

(刚刚添加了这个答案,因为Svish提到,“你无法在Java中实现交换方法” fg

答案 4 :(得分:1)

您需要通过引用传递参数,这在java中是不可能的。整数也是不可变的,所以你不能交换这些值,因为你没有setValue方法。

答案 5 :(得分:0)

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

您需要返回数组中的两个引用以实现您想要的内容

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);
} 

如果 整数有一个setValue方法,你可以这样做。

static void swap(Integer a, Integer b) {
   int temp = a.intValue();
   a.setValue(b.intValue());
   b.setValue(temp);
}

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

答案 6 :(得分:0)

因为所有人都提到了传递价值的东西。

只是喜欢添加:你可以使用这种交换GLOBAL整数的方法。

private void swap (){
     a ^= b;
     b ^= a;
     a ^= b;
}

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

答案 7 :(得分:0)

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

首先,它的可读性差得多。第二,有时候这种情况比较快,但现在情况恰恰相反。见

Wikipedia

供参考。

答案 8 :(得分:0)

Java代码:

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);

    }
}

输出:

trial.n1 = 2
trial.n2 = 3
trial.n1 = 3
trial.n2 = 2

答案 9 :(得分:0)

使用扫描仪:

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);
 }    
}