我有以下代码:
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值。为什么呢?
答案 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)
答案 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);
}
}