Java:将变量指定为其当前值?

Java:将变量指定为其当前值?,java,optimization,variable-assignment,Java,Optimization,Variable Assignment,如果我有一个当前为空的字符串 String s = ""; 并重新分配它 s = ""; 我不这样做不好吗 if(!s.isEmpty()){ s = ""; } 或者编译器会为我选择并优化它吗?如果在初始化和您再次分配“的点之间有任何真正的逻辑,编译器可能无法优化它。但如果不这样做也没关系,因为重新分配不会花费太多时间。从理论上讲,如果是这样,JVM中的即时编译器(JIT)(不管怎样,Oracle的JVM)会尝试优化它(如果可以的话),如果它最终成为代码中的“热点”。调用该方法的成

如果我有一个当前为空的字符串

String s = "";
并重新分配它

s = "";
我不这样做不好吗

if(!s.isEmpty()){
   s = "";
}

或者编译器会为我选择并优化它吗?

如果在初始化和您再次分配
的点之间有任何真正的逻辑,编译器可能无法优化它。但如果不这样做也没关系,因为重新分配不会花费太多时间。从理论上讲,如果是这样,JVM中的即时编译器(JIT)(不管怎样,Oracle的JVM)会尝试优化它(如果可以的话),如果它最终成为代码中的“热点”。

调用该方法的成本是空的()(在线程堆栈中分配新空间等)会抵消任何收益。如果要为变量指定一个空字符串,最有效的方法是不使用if语句。

不要对代码过于悲观。 JIT将分配转换为一个移入寄存器,其中源极有可能也驻留在寄存器中(在循环中,这样的优化会完成,除非寄存器用完)。因此,这是只需一个周期的最快指令,当前Intel可以并行执行其中4条指令

if(!s.isEmpty()){
   s = "";
}
函数调用不是问题,因为它是内联的。但是仍然有一个从
字符串
到它的
value.length的内存间接指向。不错,但是已经比简单的方法贵了。然后是一个条件分支,它可能需要几十个周期,除非CPU可以预测结果。如果不是的话,你可能仍然很幸运,JIT可能会以有条件的移动取代它。无论发生什么,它都不会比简单的代码更快

补遗 从理论上讲,您可以希望JIT发现这两个变量是等价的,并用简单的变量替换悲观的变量。但这两种变体并不等同。你需要使用

if (s != "") {
    s = "";
}

取而代之的是,除了插入的字符串之外,可能还有其他空字符串(即编译时常量
)。无论如何,我希望我们都同意,上面的代码片段是任何人都不应该使用的。

支票和分行要贵得多。但是,如果您觉得有必要对局部变量执行此操作,那么您可能会犯其他错误,例如为不相关的目的重用一个通用命名的变量,而不是给它一个有意义的名称或避免使用StringBuilder。实际上,您提到的开销通过内联得到优化,但是,您的结论是正确的。看见
if (s != "") {
    s = "";
}