1、String s="ab";
只生成了一个ab对象
2、String s="a"+"b";常量字符串拼接 底层会优化为 String s="ab";和上面一样 也生成一个对象。
3、String s=new String("ab");
这里面通过字节码能够很清楚的看到就是两个对象
- 一个对象是:new关键字在堆空间中创建的
- 另一个对象:字符串常量池中的对象"ab"。 字节码指令:ldc
4、String s=new String("a")+new String("b");
字节码显示创建了6个对象
对象1:new StringBuilder()
对象2: new String(“a”)
对象3: 常量池中的"a"
对象4: new String(“b”)
对象5: 常量池中的"b"
深入剖析: StringBuilder的toString():
对象6 :new String(“ab”)
强调一下,toString()的调用,在字符串常量池中,没有生成"ab";
调用s.intern()方法,如果字符串常量池没有就生成 ab;(具体详情看版本)