/**
* 思考:
* new String("a") + new String("b")呢?
* 对象1:new StringBuilder()
* 对象2: new String("a")
* 对象3: 常量池中的"a"
* 对象4: new String("b")
* 对象5: 常量池中的"b"
*
* 深入剖析: StringBuilder的toString():
* 对象6 :new String("ab")
* 强调一下,toString()的调用,在字符串常量池中,没有生成"ab"
*
*/
public class StringNewTest {
public static void main(String[] args) {
String str = new String("a") + new String("b");
}
}
字节码指令:
0 new #2 <java/lang/StringBuilder>
3 dup
4 invokespecial #3 <java/lang/StringBuilder.<init>>
7 new #4 <java/lang/String>
10 dup
11 ldc #5 <a>
13 invokespecial #6 <java/lang/String.<init>>
16 invokevirtual #7 <java/lang/StringBuilder.append>
19 new #4 <java/lang/String>
22 dup
23 ldc #8 <b>
25 invokespecial #6 <java/lang/String.<init>>
28 invokevirtual #7 <java/lang/StringBuilder.append>
31 invokevirtual #9 <java/lang/StringBuilder.toString>
34 astore_1
35 return
答案是4个或5个或6个
字节码指令分析:
0 new #2 <java/lang/StringBuilder>:拼接字符串会创建一个 StringBuilder 对象7 new #4 <java/lang/String>:创建 String 对象,对应于 new String(“a”)11 ldc #5 <a>:在字符串常量池中放入 “a”(如果之前字符串常量池中没有 “a” 的话)19 new #4 <java/lang/String>:创建 String 对象,对应于 new String(“b”)23 ldc #8 <b>:在字符串常量池中放入 “b”(如果之前字符串常量池中没有 “b” 的话)31 invokevirtual #9 <java/lang/StringBuilder.toString>:调用 StringBuilder 的 toString() 方法,会生成一个 String 对象
本文探讨了使用new关键字创建字符串并进行拼接的过程。通过字节码指令详细解析了这一操作涉及的对象创建步骤,并强调了StringBuilder在字符串拼接中的作用及toString()方法的行为。

被折叠的 条评论
为什么被折叠?



