有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java哪个更适合交换数字?使用临时变量还是不使用临时变量?这有关系吗?

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

与温度变量交换

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;

它是有效的,但在性能方面哪一个更好?当它只是一次的时候,我认为操作性能并不重要。但是如果我需要使用这种交换方法反转一个巨大的数字数组,或者在需要交换的选择排序过程中,等等。。,创建局部变量更好还是用算术运算更好


共 (2) 个答案

  1. # 1 楼答案

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

    1. 你可以测量它
    2. 只有当你测量过这个优化水平,并且这确实是一个问题时,才考虑这个优化水平。(在这种情况下,您很可能无法测量任何明显的差异。)
    3. 当有疑问时,通常最好选择更简单/更规范的解决方案。很多优化都是基于您编写“正常”代码的前提,并且会寻找开发人员通常采用的模式。幼稚的优化工作有时会导致Java Hotspot性能低下

    因此,除非你想深入到精彩而棘手(但有趣)的微基准标记世界,否则只需使用temp变量即可

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

    注意:如果要反转一个巨大的阵列,运行时间将主要由对阵列的内存访问决定

  2. # 2 楼答案

    我将使用temp变量(即您的第一个选项)明确地说。如果您参考第二个示例,您总共完成了三个操作。对于每个操作,java虚拟机都会生成等效的汇编操作。但是在使用temp变量的第一个选项中,您只是在交换值。因此,只需从地址读取并写入地址,就可以进行非常小的汇编操作