Java 交换号码哪个更好?使用临时变量还是不使用临时变量?这有关系吗?
有人问我一个问题,在不使用临时变量的情况下交换两个数字。用下面的答案回答这个问题很容易 与温度变量交换Java 交换号码哪个更好?使用临时变量还是不使用临时变量?这有关系吗?,java,performance,reverse,swap,Java,Performance,Reverse,Swap,有人问我一个问题,在不使用临时变量的情况下交换两个数字。用下面的答案回答这个问题很容易 与温度变量交换 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; 不带温度变量的交换 int a =10; int b =20; int temp = a; a = b; b = temp; int a =10; int b =20; a = a+b;
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;
不带温度变量的交换
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
变量的第一个选项中,您只是在交换值。因此,只需从地址读取并写入地址即可进行非常小的汇编操作。除了第二个地址可能溢出*,还有三种可能的答案:
附言:如果您要反转一个巨大的数组,那么运行时间将主要由对该数组的内存访问决定。您是在问Java还是Javascript?他们是完全不同的语言。这看起来像是Java而不是Javascript——如果你实际上只对Java感兴趣,请删除Javascript标签。第一个标签更具可读性。在您发布的示例中,如果没有一个临时变量,那么它对性能的影响应该不会太大。这在Java中并不重要,但其他语言可能会有问题。后者确实是这样。在优化之后,几乎可以肯定地省略了temp变量-
a
被复制到一个寄存器,b
被复制到另一个寄存器。然后,a
的值存储在b
中,b
的值存储在a
中。您能举一个例子说明a
和b
的值使用第二种方法会产生错误的结果吗?是的,a+b
或a-b
可能会溢出/下溢,但这会产生错误的交换结果吗?