'+'是否在堆中创建新对象?

时间:2018-08-12 08:22:35

标签: java string immutability

运行此代码时

String a="sa";
String s = "s";
String b=s + "a";
System.out.println(b==a);

打印错误。怎么样? b是新的String对象吗?

2 个答案:

答案 0 :(得分:0)

您部分正确,如果表达式不是常量表达式,+运算符 会创建一个新的String对象。

根据Java语言规范Section 15.18.1

(重点是我的)

  

§15.18.1字符串串联运算符+

     

如果只有一个操作数表达式的类型为String,则字符串   对另一个操作数执行转换(第5.1.11节)以产生一个   运行时输入字符串。

     

字符串连接的结果是对String对象的引用   这是两个操作数字符串的串联。那些角色   左操作数的放在右字符之前   新创建的字符串中的操作数。

     

String对象是新创建的(第12.5节),除非表达式是   常量表达式(第15.28节)。

通过常量表达式,其含义类似于:

"a" + "b" // this will always evaluate to "ab", so it's constant.

a + b

其中ab被声明为final

有关详细信息,请参见§15.28

答案 1 :(得分:0)

它会创建新字符串,因为您正在与对象实例连接。

如果要使用字符串池中已经存在的字符串,则应使用常量表达式进行连接。

如果您希望a == b为true,则应使用以下实习生:

String b= (s + "a").intern();
System.out.println(b==a);

或者您可以使用constans表达式:

String b= "s" + "a"
System.out.println(b==a);

它也会打印真实的