赋值运算符在Java中是否消耗内存?

Does the assignment operator consume memory in Java?

我有如下两个字符串:

"yes", "no".

现在,我想用两种方式比较这些字符串:

  1. 直接:
    示例:"yes".equals("no")

  2. 通过将字符串分配给某个变量: 示例:

    String string1 = "yes";
    String string2 ="no";
    string1.equals(string2);
    

在这两种情况下,是否存在内存或性能差异?

有一个非常小的区别(实际上可以忽略不计,我们在这里谈论微优化),因为字符串应该存储在一个局部变量中,该变量在相应方法的堆栈帧上占用额外的内存位.而常量实际上存储在常量池中并共享。基于调用次数对 JVM 进行可能的优化,这不会有什么不同。

请注意,如果变量是 final 或实际上是 final(仅分配一次),字节码将是相同的,因为在这种情况下,它们被视为常量。

我猜,根据编译器的不同,它可能需要 space 堆栈上的 2 个附加对象引用。它们足够小,您通常可以忽略它们,除非您分析了您的应用程序并在那里发现了问题(可能性很小)。

"yes".equals("no")

在实际代码中几乎不会出现这种情况,因为您已经知道 2 个文字是否相同。

编译这些代码片段将产生相同的字节码。因此,没有内存消耗或性能差异。

赋值运算符从不消耗内存(自动装箱情况除外:Integer number = 42)。局部变量声明可以在堆栈中分配内存(如果需要),但您应该更喜欢代码可读性。