public class Test {
public static void main(String[] args){
String a = "a";
String b = "b";
String ab1 = "ab";
String ab2 = "a" + "b";
String ab3 = "a" + "b".toLowerCase();
String ab4 = a + b;
String ab5 = new String("ab");
String ab6 = new String("ab");
System.out.println(ab1 == ab2);//true
System.out.println(ab1 == ab3);//false
System.out.println(ab2 == ab3);//false
System.out.println(ab1 == ab4);//false
System.out.println(ab4 == ab5);//false
System.out.println(ab5 == ab6);//false
}
}
String在对在编译时可以确定的常量会做一定的优化,把其放在字符串常量池中。(ab1==ab2为true)
+ 和 new出来的对象都是存储在堆内
对象引用都是存储在栈内
String a = "a";
这条语句在执行的时候,会在常量池内创建一个String对象,内容为a,a指向这个对象。
String ab5 = new String("ab");
这条语句在执行的时候,会先去常量池内查找有没有值为ab的对象,没有的话,就创建,有的话,就在堆上面创建一个新的对象,内容是ab,ab5指向这个在堆上创建的对象。