Stirng创建对象的个数
String str="a",和String str = new String("a");
- String str="a"创建了一个String对象,并放进了 String常量池中。因为String创建池不可能存在两个相同的字符串。所以如果在继续 String str1="a",将不会继续创建对象。
- String str = new String("a")会创建两个对象,一个放在堆里(new出来了对象),一个放在String常量池中。同理,如果后面继续String str = new String("a"),只会创建一个对象,放在堆中的(new)。
带"+":
-
字面值+字面值
当"+"两端均为编译期确定的字符串常量时,编译器会进行相应的优化,直接将两个字符串常量拼接好。所以只会创建一个"abcdef"对象
String s1 = "abc" + "def";//一个
-
字面值+对象
”+“中有String对象的时候,所有没有在常量池中的字符串都会被创建一个对象
s1="abc";
String s2 ="abc"+s1+"def";
创建了三个对象,
s1="abc"一个
s2中:"abc"已经存在,不再创建,"def"一个,"abcdef"一个。
-
new String("xx") + new String("xx")
String s = new String("abc") + new String("abc");
四个
第一个new String("abc")创建了两个
第二个new String("abc")创建了一个(常量池中有"abc"不再创建)
new String("abc") + new String("abc")一个
String s = new String("abc") + new String("def");
五个
第一个new String("abc")创建了两个
第二个new String("def")创建了两个
new String("abc") + new String("def")一个
-
字面量+new String("xx")
String s = "abc" + new String("def");
四个
"abc"一个
new String("def")两个
"abc" + new String("def")一个