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值。 为什么?

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

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

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

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

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

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

如果要为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

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

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

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

 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方法,你可以这样做。

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

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

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

首先,它的可读性要低得多。 其次,有时候这种情况比较快,但现在情况恰恰相反。 看到

维基百科

以供参考。

正如所有人都提到它的价值传递一样。

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

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

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

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 

使用扫描仪:

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