我被问到一个问题,即在不使用临时变量的情况下交换两个数字。通过以下答案很容易回答这个问题。
使用临时变量进行交换
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;
它有效,但在性能方面哪个更好?当它只有一次操作时,性能并不重要。但是,如果我需要使用这种交换方法或在需要交换的选择排序等期间反转大量数字,那么创建局部变量更好还是用算术运算来做?
答案 0 :(得分:2)
我肯定会说temp
变量,即您的第一个选项。如果你参考你的第二个例子,你已经完成了三次操作。对于每个操作,您的Java虚拟机都会生成等效的汇编操作但是在您使用temp
变量的第一个选项中,您只需交换值。因此,只有从地址读取和写入地址的非常小的汇编操作。
答案 1 :(得分:1)
除了第二个可以溢出*之外,还有三个可能的答案:
因此,除非您想深入了解微型基准测试的精彩且棘手(但有趣)的世界,否则请使用临时变量。
*虽然由于Java处理溢出的方式,你仍然会得到正确的结果。但是,除此之外,如果使用xor而不是算术运算,则不存在溢出的危险。
P.s。:如果你正在倒转一个巨大的阵列,那么运行时间绝大部分将受到阵列内存访问的支配。