String a = “abc”;
1.判断字符串常量池有没有"abc"
没有则加进去,返回引用;有则返回引用
总共创建一个String对象:常量池中"abc"
String a = new String(“abc”);
1.判断字符串常量池有没有"abc"
没有则加进去
2.在堆中new一个String对象,value字符数组存"abc"
总共创建两个String对象:常量池中"abc",堆中"abc"
String a = new String(“abc)+ new String(“def)
1.判断字符串常量池有没有"abc”,“def”
没有则加进去
2.+重载,代码相当于
String a = new StringBuilder(new String(“abc)).append(new String(“def”)).toString()
3.先进行append得到StringBuilder,value字符数组存"abcdef”
4.然后进行toString(),相当于new String(value字符数组)
这里注意是把value字符数组当参数加进去,而不是将String字符串"abcdef"加进去,所以这里并没有往字符串常量池加"abcdef”
总共创建五个对象:常量池中"abc",“def”,堆中"abc",“def”,“abcdef”
String a = “abc”;
String b = a.intern();
System.out.println(a==b);
结果true
a.intern()判断常量池有没有字符串"abc",判断有,则直接返回"abc"的引用
所以a==b
String a = new StringBuilder(“a”).append(“bc”).toString();
String b = a.intern();
String c = “abc”;
System.out.println(b==c);
结果true
首先通过之前的方法,通过StringBuilder避免在常量池中放入"abc"的情况下创建堆中字符串"abc"
然后String b = a.intern(); 因为常量池没有字符串"abc",所以intern方法先将"abc"放入常量池,然后返回常量池"abc"的引用给b
String c = “abc”;直接获取常量池中"abc"的引用
最终判断相等
更正:
String a = new String(“abc”)+ new String(“def”);
String b = a.intern();
String c = “abcdef”;
System.out.println(c==a);
System.out.println(b==a);
System.out.println(b==c);
结果为true true true
String a = new String(“abc”)+ new String(“def”);
String c = “abcdef”;
String b = a.intern();
System.out.println(c==a);
System.out.println(b==a);
System.out.println(b==c);
结果为false false truel
以上结果说明:如果字符串常量池无"abcdef"时,调用a.intern(),会往字符串常量池存a的引用