Java: 给变量赋当前值?

Java: Assigning a variable its current value?

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

String s = "";

并重新分配它

s = "";

我不这样做是不是很糟糕?

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

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

如果在初始化和再次分配 "" 之间存在任何实际逻辑,编译器可能无法优化它。但如果不这样做也没关系,因为重新分配不会花费大量时间。从理论上讲,如果确实如此,如果它最终成为 "hot spot"代码。

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

不要微观悲观你的代码。

s = "";

赋值由 JIT 翻译成移入寄存器,其中源很可能也驻留在寄存器中(在循环中,除非您 运行 超出寄存器,否则就会完成这种优化)。所以它是最快的指令,只需要一个周期,目前的英特尔可以并行执行其中的 4 个指令。

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

函数调用不是问题,因为它是内联的。但是仍然存在从 Stringvalue.length 的内存间接寻址。不错,但已经比简单的方法贵多了。然后是一个条件分支,这可能需要几十个循环,除非结果可以通过CPU来预测。如果不是,您仍然可能很幸运,JIT 可能会通过有条件的移动来替换它。 无论发生什么,它永远不会比更简单的代码更快。

附录

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

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

而不是内部字符串(即编译时间常量 "")。无论如何,我希望我们同意上面的片段是任何人都不应该使用的。