赋值运算符在Java中是否消耗内存?
Does the assignment operator consume memory in Java?
我有如下两个字符串:
"yes", "no"
.
现在,我想用两种方式比较这些字符串:
直接:
示例:"yes".equals("no")
通过将字符串分配给某个变量:
示例:
String string1 = "yes";
String string2 ="no";
string1.equals(string2);
在这两种情况下,是否存在内存或性能差异?
有一个非常小的区别(实际上可以忽略不计,我们在这里谈论微优化),因为字符串应该存储在一个局部变量中,该变量在相应方法的堆栈帧上占用额外的内存位.而常量实际上存储在常量池中并共享。基于调用次数对 JVM 进行可能的优化,这不会有什么不同。
请注意,如果变量是 final
或实际上是 final
(仅分配一次),字节码将是相同的,因为在这种情况下,它们被视为常量。
我猜,根据编译器的不同,它可能需要 space 堆栈上的 2 个附加对象引用。它们足够小,您通常可以忽略它们,除非您分析了您的应用程序并在那里发现了问题(可能性很小)。
"yes".equals("no")
在实际代码中几乎不会出现这种情况,因为您已经知道 2 个文字是否相同。
编译这些代码片段将产生相同的字节码。因此,没有内存消耗或性能差异。
赋值运算符从不消耗内存(自动装箱情况除外:Integer number = 42
)。局部变量声明可以在堆栈中分配内存(如果需要),但您应该更喜欢代码可读性。
我有如下两个字符串:
"yes", "no"
.
现在,我想用两种方式比较这些字符串:
直接:
示例:"yes".equals("no")
通过将字符串分配给某个变量: 示例:
String string1 = "yes"; String string2 ="no"; string1.equals(string2);
在这两种情况下,是否存在内存或性能差异?
有一个非常小的区别(实际上可以忽略不计,我们在这里谈论微优化),因为字符串应该存储在一个局部变量中,该变量在相应方法的堆栈帧上占用额外的内存位.而常量实际上存储在常量池中并共享。基于调用次数对 JVM 进行可能的优化,这不会有什么不同。
请注意,如果变量是 final
或实际上是 final
(仅分配一次),字节码将是相同的,因为在这种情况下,它们被视为常量。
我猜,根据编译器的不同,它可能需要 space 堆栈上的 2 个附加对象引用。它们足够小,您通常可以忽略它们,除非您分析了您的应用程序并在那里发现了问题(可能性很小)。
"yes".equals("no")
在实际代码中几乎不会出现这种情况,因为您已经知道 2 个文字是否相同。
编译这些代码片段将产生相同的字节码。因此,没有内存消耗或性能差异。
赋值运算符从不消耗内存(自动装箱情况除外:Integer number = 42
)。局部变量声明可以在堆栈中分配内存(如果需要),但您应该更喜欢代码可读性。