String s1 = new String("abc");不会放入字符串常量池中
String s2 = "abc";//会直接放入字符串常量池中,若本来就有,则指针指向其
String s3 = s1.intern();
System.out.println(s1 == s2);false
System.out.println(s3 == s1);false
System.out.println(s3 == s2);true
String s1 = "abc";
String s2 = "abc";
String s3 = s1.intern();
String s4 = s1 + s2;
String s5 = "abcabc";
System.out.println(s4 == s5);false
字符串拼接操作:
- 常量与常量的拼接结果在常量池,原理是编译期优化
- 常量池中不会有相同内容的常量
- 只要其中有一个是变量,+操作后就在堆中。拼接原理是StringBuilder
- 如果拼接的结果调用intern()方法,则主动将常量池中还没有的字符串对象放入池中,并返回此对象地址。
new String(“ab”)会创建几个对象?答案:一个或者两个
一个是:new关键字在堆空间创建的
另一个是:"ab"字符串常量池中的对象(若常量池中本来已存在那就没有创建)