如果 == 比较 Java 中的引用,为什么这些字符串的计算结果为 true?

2022-09-03 16:48:16

如前所述,== 运算符比较对象引用,以检查它们是否引用堆上的同一对象。如果是这样,为什么我会得到这段代码的“相等”?

public class Salmon {
    public static void main(String[] args) {

        String str1 = "Str1";
        String str2 = "Str1";

        if (str1 == str2) {
            System.out.println("Equal");
        } else {
            System.out.println("Not equal");
        }
    }
}

答案 1

程序将打印“等于”。(至少使用 Sun Hotspot 和 suns Javac。这里演示了它 http://ideone.com/8UrRrk

这是因为字符串文本常量存储在字符串池,并且可以重用字符串引用。

延伸阅读:


但是:

public class Salmon {
    public static void main(String[] args) {

        String str1 = "Str1";
        String str2 = new String("Str1");

        if (str1 == str2) {
            System.out.println("Equal");
        } else {
            System.out.println("Not equal");
        }
    }
}

将打印,因为保证引入新的参考。Not equalnew

因此,经验法则:始终使用 equals 方法比较字符串。


答案 2

Java 在运行期间将所有字符串存储在内部字符串表中。对这两个字符串的引用是相同的,因为它们在内存中存储在同一位置。因此。Equal

你的陈述是正确的,它比较了对象引用。对除字符串以外的任何其他类尝试相同的操作,您将不会得到相同的结果。==