是否可以在Java中交换两个变量?

时间:2012-05-01 04:51:55

标签: java

  

可能重复:
  Is it possible to write swap method in Java?

给定两个值x和y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中是否可行?

3 个答案:

答案 0 :(得分:32)

不是原始类型(intlongchar等)。 Java按值传递东西,这意味着你的函数传递的变量是原始的副本,你对副本所做的任何更改都不会影响原件。

void swap(int a, int b)
{
    int temp = a;
    a = b;
    b = temp;
    // a and b are copies of the original values.
    // The changes we made here won't be visible to the caller.
}

现在,对象有点不同,因为对象变量的“值”实际上是对对象的引用 - 复制引用使它指向完全相同的对象。

class IntHolder { public int value = 0; }

void swap(IntHolder a, IntHolder b)
{
    // Although a and b are copies, they are copies *of a reference*.
    // That means they point at the same object as in the caller,
    // and changes made to the object will be visible in both places.
    int temp = a.value;
    a.value = b.value;
    b.value = temp;
}

限制是,您仍然无法以调用者可以看到的任何方式修改ab本身的值(即,您无法将它们指向不同的对象)。但是你可以交换他们引用的对象的内容。

顺便说一句,从OOP的角度来看,上述内容相当可怕。这只是一个例子。不要这样做。

答案 1 :(得分:6)

如果不使用任何对象或数组,就无法在Java中执行此操作。

See this Stackoverflow Post

答案 2 :(得分:5)

我会在这里变得非常讨厌和迂腐,因为“值”这个词在Java中具有非常特殊的含义,人们通常不会理解,特别是当变量持有对象的引用时。

我将假设问题要求这种行为:

x = initialValueForX;
y = initialValueForY;
swap(x, y);
// x now holds initialValueForY;
// y now holds initialValueForX;

这是不可能的,因为Java会按值传递方法的所有参数。您永远不能以这种方式更改xy内存储的实际值。

可以,但是,如果xy保持对对象的引用,则更改两个对象的属性,以使打印值看起来喜欢彼此的初始值:

x = initialValueForX;
y = initialValueForY;
swap(x, y);
System.out.println(x);  prints what looks like initialValueForY
System.out.println(y);  prints what looks like initialValueForX

如果你对价值的理解是对象的样子,而不是对象的身份,那么这是有效的。通常,这是可以接受的。

这里会给出一个很好的例子,但是cHao已经做了。另外还有其他人指出这是一个重复的问题。