是否可以在Java中编写swap方法?

Ara*_*raK 49 java swap primitive-types

这是一个问题:编写一个交换两个变量的方法.这两个变量应该是原始的.它不需要是通用的,例如两个int变量.有办法吗?!

mar*_*cus 50

虽然不可能编写一个简单地交换两个变量的函数,但是可以编写一个辅助函数来执行以下操作:

  • 使用一个语句交换两个变量
  • 没有调用者代码中的临时变量
  • 没有'拳击'原语
  • 有一些重载(其中一个使用泛型),它适用于任何类型

这就是你如何做到的:

int returnFirst(int x, int y) {
    return x;
}
int a = 8, b = 3;
a = returnFirst(b, b = a); // try reading this as a = b; b = a;
System.out.println("a: " + a + ", b: " + b); // prints a: 3, b: 8
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为Java语言保证(Java语言规范,Java SE 7版,第15.12.4.2节)所有参数都是从左到右进行评估(不同于其他语言,其中评估的顺序是未定义的),因此执行顺序是:

  1. 计算原始值,b以便作为函数的第一个参数传递
  2. 计算表达式b = a,并将结果(新值b)作为函数的第二个参数传递
  3. 该函数执行,返回原始值b并忽略其新值
  4. 您将结果分配给 a

如果returnFirst太长,您可以选择较短的名称以使代码更紧凑(例如a = sw(b, b = a)).用它来打动你的朋友并迷惑你的敌人:-)

  • 如果您将函数命名为 `_`,那么您几乎可以**写出 **`a=b;b=a;`**。看看它看起来有多干净(?):**`a=_(b,b=a);`** (3认同)
  • 哎呀,_在Java 8中被弃用为标识符,可以在Java 9中删除.不确定它们将用于什么. (2认同)

Tho*_*ens 45

如果不使用数组或对象,则不可能在方法中执行此操作.

  • 顺便说一句,数组是对象,所以你真的只需要说对象.来自java.sun.com:"数组是一个容器对象,它包含固定数量的单一类型的值." 挑剔我知道:) (2认同)

Bre*_*ode 18

查看这篇详细解释它的JavaWorld文章:

http://www.javaworld.com/javaworld/javaqa/2000-05/03-qa-0526-pass.html

两个原语的交换将永远不会起作用,因为原语是通过Java中的值传递的.你甚至无法编写一个方法来交换两个对象.

就像@Thomas所说,你唯一能做的就是将你的原语包含在其他对象/数组中并修改它们.


Ole*_*lov 8

任何原始数字的单行:

a += (b - (b = a));
Run Code Online (Sandbox Code Playgroud)