1.String a = “abc”;
这是在字符串常量池中创建一个abc字符串(若存在则不创建),对象a指向它。
String a ="abc";
String b ="abc";
String c = new String("abc");
a==b //true
a==c //false
2.String b = new String(“abc”);
这是在堆中开辟一块空间(new String),b指向该块空间,然后在字符串常量池中创建一个abc字符串(若存在则不创建),堆中的new String对象指向它。
String a ="abc";
String b = new String("abc");
String c = new String("abc");
a==b //false
b==c //false
3.String c = “ab”+new String(“c”);
这种方式和2相同。
这是在堆中开辟一块空间(new String),c指向该块空间,然后在字符串常量池中创建一个abc字符串(若存在则不创建),堆中的new String对象指向它(就相当于String c = new String(“abc”))。
String a ="abc";
String b = "ab"+new String("c");
String c = new String("abc");
a==b //false
b==c //false
4.String d = test()+“c”;
这种方式和第三种类似,都是在运行时确定String对象的值,编译器不能进行优化,编译器并不知道d对象应该指向字符串常量池中的哪个,因此该方式就相当于String d = new String(“abc”)。
public class Test {
public static String test(){
return "ab";
}
public static void main(String[] args) {
String a = "abc";
String b = "ab" + "c";
String c = new String("ab") + "c";
String d = test() + "c";
System.out.println(a==b); //true
System.out.println(a==c); //false
System.out.println(a==d); //false
}
}
5.String a = “i”; String b = “love”;String c = “java”;String str = a+b+c;
这种情况下只有运行时才能确认str最终是什么,编译器并不会进行优化,是通过StringBuilder实现的(实际上是通过StringBuilder最后toString()得到的结果,也是一个new String对象)。
public class test {
public static void main(String[] args) {
String a = "i";
String b = "love";
String c = "java";
String str = a+b+c;
System.out.println(str=="ilovejava"); //false
}
}