【问题标题】:Difference between + and += on Java StringsJava 字符串中 + 和 += 的区别
【发布时间】:2020-11-23 18:50:25
【问题描述】:

我想了解当我们在 Java 中对字符串使用 + 和 += 时如何分配内存。 我知道字符串字面量存储在字符串常量池中,在案例 #1 中,s1 和 s2 都引用字符串常量池中的相同内存。

在案例 #2 中,即使我使用 + 运算符,它仍然引用字符串常量池中的相同对象

我觉得有趣的是案例#3。在这种情况下如何以及在哪里分配内存?它与案例 #2 有何不同

//Case #1
String s1 = "Hello Java";
String s2 = "Hello Java";
System.out.println(s1 == s2); //true

//Case #2
s1 = "Hello" + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //true

s1 = "Hello";
s1 += " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

【问题讨论】:

  • 使用equals()进行字符串比较
  • @B001ᛦ:我认为 OP 的 intent 是比较对象的同一性,而不是字符串的相等性。

标签: java string memory heap-memory string-pool


【解决方案1】:

这实际上并不是++= 之间的区别;如果你写的话,你会得到与案例 #3 相同的行为:

s1 = "Hello";
s1 = s1 + " Java";
s2 = "Hello Java";
System.out.println(s1 == s2); //false

您在案例 #2 中看到的行为的原因是 "Hello" + " Java" 是一个常量表达式 [JLS8 §15.28],因此它实际上可以在编译时处理,就像它一样是"Hello Java",并且需要像"Hello Java"一样被实习。

当您将其分解为单独的语句时,情况不再如此,因此您会得到一个新创建的字符串 [JLS8 §15.18.1]。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多