class StringEqualTest {
public static void main(String[] args) {
String s1 = "Programming";
String s2 = new String("Programming");
String s3 = "Program" + "ming";
System.out.println(s1 == s2);
System.out.println(s1 == s3);
System.out.println(s1 == s1.intern());
}
}
补充:String对象的intern方法会得到字符串对象在常量池中对应的版本的引用(如果常量池中有一个字符串与String对象的equals结果是true),如果常量池中没有对应的字符串,则该字符串将被添加到常量池中,然后返回常量池中字符串的引用。
结果:
false
true
true
new的话都是创建一个新的地址
字符串常量相加,jvm 会进行优化,不会创建 StringBuilder 对象
String a = "Hello" + "world" + "!";
字符串变量加上常量,会创建 StringBuilder 对象,然后调用 append 方法
1 String a = "Hello"; 2 a += "top"; 3 a += "bottom";
for 循环中的字符串变量加上常量,会被优化成 StringBuilder.append(),多次相加只会创建一个 StringBuilder 对象
1 String a = "Hello"; 2 for (int i = 0; i < 5; i++) { 3 a += "world"; 4 }