用于理解 String类常量和对象的例子:
public static void main(String[] args) {
String s1 = "AB";
String s2 = new String("AB");
String s3 = "A";
String s4 = "B";
String s5 = "A" + "B";
String s6 = s3 + s4;
System.out.println(s1 == s2); //false
System.out.println(s1 == s5); //true
System.out.println(s1 == s6); //false
System.out.println(s1 == s6.intern()); //true
System.out.println(s2 == s2.intern()); //false
}
解析:
1)直接使用双引号声明出来的 String 对象会直接存储在常量池中;
2)String 对象的 intern() 方法会得到字符串对象在常量池中对应的引用,如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用;
3)字符串的 + 操作其本质是创建了 StringBuilder 对象进行 append 操作,然后将拼接后的 StringBuilder 对象用 toString() 处理成 String 对象。
4)编译时确定的 final 常量相加判断为 true(即 s5),运行时确定的 final 变量相加为false(即 s6),是因为执行了 StringBuilder 的 toString() 方法,这个方法里面会执行 return new String(value, 0, count); 相当于在堆上新建一个 String 对象,而不是在堆的常量池中新建一个 String 对象。
————————————————
版权声明:本文为CSDN博主「PesenX」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/ifwinds/article/details/80849184