Java中操作符"=="和equals方法的区别

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虚拟机为了提高效率并节约内存,对具有相同字符序列的字符串字面值使用同一个实例,这样的实例称为 驻留的字符串

Java中操作符"=="和equals方法的区别

关于String内存中的详解可以参考 Stirng内存详解(原版)   翻译版