字符串相加 在字符串常量池中会存在吗

万载小笼包 2018-11-15 03:24:12
我有一个疑问,就是字符串相加,是不是一定会在常量池中存在

主要是在了解intern的时候 遇到了这样问题(针对jdk1.7或以上版本)

String a = new String("abc");
// 第一次,创建了两个对象,一个是堆中的string对象,一个是常量池中的"abc"
System.out.println(a.intern() == a);// false


String str = new String("a") + new String("b");
System.out.println(str.intern() == str);// true


为什么a.intern() == a是false ,而str.intern() == str是true

我认为关键点是在new String("a") + new String("b");
两个new字符串相加的结果并没有存在于 字符串池中。
然后我看到了一句话 "对于所有包含new方式新建对象(包括null)和变量形式 的“+”连接表达式,它所产生的新对象都不会被加入字符串池中"
我就是想知道 变量或是new形式相加为什么新对象不会加入字符串池中

这个有原因或是解释的吗
还是说这就是 公式 定理....



...全文
499 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
IamVeryCool 2021-05-20
  • 打赏
  • 举报
回复
nihility回答
Nihility/ 2018-11-16
  • 打赏
  • 举报
回复 4
为什么没加入到常量池是由VJM决定的,
new String("a") + new String("b");
底层实际上是使用StringBuilder.append()来实现“+”操作的。 最终返回给变量的是一个新的String对象(就是新new出来的String)。 ============================================ 为什么a.intern() == a是false ,而str.intern() == str是true a的引用(引用1)实际上是new String("abc")对象的引用,而非常量池中"abc"的引用(引用2),这两个引用地址是不一样的,所以会有a.intern() == a是false;
String str = new String("a") + new String("b")
中,new String("a") + new String("b")返回的是新对象(StringBuilder.toString()返回的对象,引用3),在str.intern()的时候,会去常量池检查是否存在,如果不存在,则将引用3存到常量池并返回。即str.intern()的引用和str的引用为同一个,所以str.intern() == str是true
小流氓dy 2018-11-16
  • 打赏
  • 举报
回复
只有使用引号包含文本的方式创建的 String对象之间使用“+”连接产生的新对象才会被加入字符串池中

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧