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