双引号字符串加号(+)拼接 创建了几个对象?
结论先行:
双引号字符串 加号(+) 拼接,不论多少,只创建了一个对象。
昨天看到一个题目,挺有意思的。
大意是:
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文件,类加载,发现这个变量之后,直接放入字符串常量池。
如有问题,欢迎指正