Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 交换号码哪个更好?使用临时变量还是不使用临时变量?这有关系吗?_Java_Performance_Reverse_Swap - Fatal编程技术网

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 Hotspot性能低下
  • 因此,除非你想深入到精彩而棘手(但有趣)的微基准标记世界,否则只需使用temp变量即可

    *尽管由于Java处理溢出的方式,您仍然可以得到正确的结果。但另一方面,如果使用xor而不是算术运算,则不会有溢出的危险


    附言:如果您要反转一个巨大的数组,那么运行时间将主要由对该数组的内存访问决定。

    您是在问Java还是Javascript?他们是完全不同的语言。这看起来像是Java而不是Javascript——如果你实际上只对Java感兴趣,请删除Javascript标签。第一个标签更具可读性。在您发布的示例中,如果没有一个临时变量,那么它对性能的影响应该不会太大。这在Java中并不重要,但其他语言可能会有问题。后者确实是这样。在优化之后,几乎可以肯定地省略了temp变量-
    a
    被复制到一个寄存器,
    b
    被复制到另一个寄存器。然后,
    a
    的值存储在
    b
    中,
    b
    的值存储在
    a
    中。您能举一个例子说明
    a
    b
    的值使用第二种方法会产生错误的结果吗?是的,
    a+b
    a-b
    可能会溢出/下溢,但这会产生错误的交换结果吗?