换号哪个好?使用或不使用临时变量?这有关系吗?

Which is better to swap numbers? Using temporary variable or without it? Does it even matter?

有人问我一个不使用临时变量交换两个数字的问题。用以下答案很容易回答这个问题。

与临时变量交换

int a =10;
int b =20;
int temp = a;
a = b;
b = temp;

交换没有临时变量

int a =10;
int b =20;
a = a+b;
b = a-b;
a = a-b;

可以,但是在性能方面哪个更好?我认为只有一次操作性能并不重要。但是,如果我需要使用这种交换方法或在需要交换的选择排序期间反转大量数字,那么创建局部变量更好还是使用算术运算来实现?

我会肯定地说 temp 变量,即你的第一个选项。如果您参考第二个示例,您总共完成了三个操作。对于每个操作,您的 java 虚拟机都会生成等效的汇编操作。但是在带有 temp 变量的第一个选项中,您只是在交换值。因此,非常少的汇编操作仅用于读取地址和写入地址。

除了第二个可能溢出*之外,还有三个可能的答案:

  1. 你可以测量它。
  2. 只有在您进行了测量并且这确实被证明是一个问题时,才考虑这种优化级别。 (在这种情况下,您不太可能测量出任何明显的差异。)
  3. 如有疑问,通常最好选择更简单/更规范的解决方案。许多优化都是基于您编写 "normal" 代码的前提,并且会寻找开发人员通常使用的模式。天真的优化工作有时会导致 Java Hotspot 的性能下降。

因此,除非您想深入了解微基准测试的奇妙而棘手(但有趣)的世界,否则请使用临时变量。

*虽然由于 Java 处理溢出的方式,您仍然会得到正确的结果。但顺便说一句,如果你使用 xor 而不是算术运算,就没有溢出的危险。

P.s.: 如果你正在反转一个巨大的数组,运行 时间将压倒性地被对数组的内存访问所支配。