在jvm中,字符串的创建有两种,为以下两种
String s1="ab";
String s2=new String("ab");
对于s1,则直接创建在常量池中,s2,则创建在堆空间中
而在jdk1.8中,当s2调用如下方法
String intern = s2.intern();
返回的intern,则为常量池中的ab
而s2还在堆中,从而对于如下
System.out.println(s1==s2);
返回结果为:false
而intern==s1则为true
对于另一种情况
String s1="ab";
String s2= new String("a")+new String("b");
String s3="a"+"b";
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s2==s3);
结果为如下
对于s3,在编译时就将"a"+"b"转换为"ab";但常量池中已经含有,则将s1指向常量池中的"ab";
而对于s2,它为两个对象的拼接,采用的是:
String f() {
return new StringBuffer().append("a").append("b").toString();
}
而toString()方法为:
@Override
public String toString() {
return new String(value, 0, count);
}
本质上还是对象的创建,从而s2还是在堆中