Java: Why does this swap method not work?
本问题已经有最佳答案,请猛点这里访问。
我有以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
我希望它打印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 |
如果integer有setvalue方法,可以这样做。
1 2 3 4 5 |
但它没有-所以为了实现你想要的,返回一个数组。