为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梵蒂冈之花 2021-07-12 12:09:10
当我运行此代码时String a="sa";String s = "s";String b=s + "a";System.out.println(b==a);它打印错误。如何?ba 是新的 String 对象吗?
查看完整描述

2 回答

?
眼眸繁星

TA贡献1873条经验 获得超9个赞

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

根据 Java 语言规范第 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

whereab被声明final

有关详细信息,请参阅第15.28 节


查看完整回答
反对 回复 2021-07-14
?
临摹微笑

TA贡献1982条经验 获得超2个赞

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


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


在您的情况下,如果您希望 a==b 为真,则应使用实习生,如下所示:


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

System.out.println(b==a);

或者您可以使用常量表达式:


String b= "s" + "a"

System.out.println(b==a);

它也打印真


查看完整回答
反对 回复 2021-07-14
  • 2 回答
  • 0 关注
  • 165 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信