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

Sai*_*nda 7 java variable-assignment

我有两个字符串如下:

"yes", "no".

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

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

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

    String string1 = "yes";
    String string2 ="no";
    string1.equals(string2);
    
    Run Code Online (Sandbox Code Playgroud)

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

man*_*uti 14

存在一个非常小的差异(实际上可以忽略不计,我们在这里谈论微优化),因为字符串应该存储在一个局部变量中,该变量在相应方法的堆栈帧上占用额外的内存.而常量实际上存储在常量池中并共享.根据调用次数可能对JVM进行优化,它不会产生任何影响.

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

  • 我不认为这里涉及堆.它们是常量池中字符串的引用.参考变量保存在堆栈AFAIK上. (4认同)
  • @SaikiranGosikonda我不认为100次会引起明显的差异.我会浪费时间优化代码中的其他地方. (3认同)
  • 我们在这里谈论*pico-optimization*. (3认同)
  • 请注意,编译器可能必须在帧中分配插槽(这是必要的,以便可以在类加载时验证字节码),但JIT可以直接使用寄存器.如果这个代码处于热循环中(注意OP:100次迭代远不是真正的热循环 - 尝试1亿次迭代)那么JIT很可能生成最有效的机器代码,无论你是否使用不同的变量与否. (3认同)
  • *请注意,如果变量是final,则没有区别,在这种情况下,它们被有效地视为常量.*>另请注意,如果变量未在代码中的其他位置重新分配,编译器将隐式识别它们"最后"并执行与明确使用`final`关键字时相同的优化. (2认同)

Vla*_*ich 10

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

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

  • @MSmith就在这里:https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 (2认同)

Puc*_*uce 7

根据编译器的不同,我猜可能会占用堆栈上2个额外的对象引用空间.这些足够小,你通常可以忽略它们,除非你描述了你的应用程序并且你发现了一个问题(非常不可能).

"是" .equals( "无")

在实际代码中几乎没有像这样的情况,因为你已经知道2个文字是否相同.