深入 -- 双引号字符串加号(+)拼接 创建了几个对象?

双引号字符串加号(+)拼接 创建了几个对象?

结论先行

双引号字符串 加号(+) 拼接,不论多少,只创建了一个对象


昨天看到一个题目,挺有意思的。

大意是:

String a = "1"+"2"+"3"+"4";

创建了几个对象??


我当时第一反应是1个对象。

为什么呢?

因为 双引号字符串 直接写是在编译器就直接生成一个对象,class在编译的时候直接放入字符串常量池的。

这个知识点,可能时间有点久,自己也不太确定。

找两个同事问了问,给了我一个不一样的答案。

他们认为起码创建了 大于4个对象,底层是通过StringBilder 或 StringBuffer 进行的字符串拼接。

我也是一脸蒙蔽…自己分析看下呗..


分析

我们先看下JDK官方 String API中的说法:

https://docs.oracle.com/javase/8/docs/api/java/lang/String.html



注意下,上面标红的字。

根据 API 中提供的样例,可以看到是 双引号字符串对象相加

这种情况,肯定是StirngBuilder 或 StringBuffer 进行的拼接。

对于这个, 我没有异议。

看一个案例

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

String c = "9" + "8" + "7" + "6";
System.out.println(c);

这里,"2" + a , 内部是调用了StringBuilder 或 StringBuffer 的append。

来看下,反汇编:


字符串"2" 和 对象a,进行 加号(+) 拼接的时候,调用的StringBuilder 的append,没问题....


既然 JDK API 中没有明确说明多个双引号字符串相加是什么情况,我们看下反汇编的结果:


可以看到直接就是 "1234"

再看下编译后的Class文件:

按照同事说的是字符串拼接的话,那应该在Class文件、反汇编中体现出来。

但是,并没有。

在生成的Class文件中,直接就是一个拼接好的字符串。

之后,JVM再去读取Class文件、解析Class文件,类加载,发现这个变量之后,直接放入字符串常量池。


如有问题,欢迎指正

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值