string1==string2 中的操作符只能检测string1和string2是否指向同一个对象,但它不会告诉你它们的内容是否相同.因此不能用==操作符来判断两个字符串变量的内容是否相同.取而代之,应该使用equals方法
string1.equals(string2) 可以判断两个字符串变量的内容是否相同
public class Test {
public static void main(String[] args) {
String str1 = "Hello World!";
String str2 = new String("Hello World!");
String str3 = str1;
String str4 = "Hello World!";
System.out.println(str1 == str2);//false
System.out.println(str1 == str3);//true
System.out.println(str1 == str4);//true
System.out.println(str1.equals(str2));//true
System.out.println(str1.equals(str3));//true
System.out.println(str2.equals(str3));//true
}
}
上述代码 str1 == str2为false 是由于尽管str1与str2的内容相同 ,但str1是一个引用变量,它引用了一个内容为Hello World! 的字符串对象,str2又指向了一个在堆内存中新开辟的的字符串对象地址
而str1 == str4 为true的原因是: Java虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串字面值使用同一个实例,这样的实例称为 驻留的字符串
关于String内存中的详解可以参考 Stirng内存详解(原版) 翻译版