Java:为什么可以用==证明String等式?

Zee*_*mee 10 java string

我了解到它来自魔鬼,==而不是测试字符串相等String.equals(),因为每个String都是对它自己的对象的引用.

但如果我使用类似的东西

System.out.println("Hello" == "Hello");
Run Code Online (Sandbox Code Playgroud)

它打印真实.

为什么?

Jon*_*eet 26

它没有.这仍然是一件坏事 - 你仍然会测试引用相等而不是值相等.

public class Test
{
    public static void main(String[] args)
    {
        String x = "hello";
        String y = new String(x);
        System.out.println(x == y); // Prints false
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您现在看到==测试"工作",那么这是因为您真正拥有相同的参考.看到这个的最常见原因可能是由于String文字的实习,但这是在Java中永远存在的:

public class Test
{
    public static void main(String[] args)
    {
        String x = "hello";
        String y = "hel" + "lo"; // Concatenated at compile-time
        System.out.println(x == y); // Prints true
    }
}
Run Code Online (Sandbox Code Playgroud)

这由Java语言规范的第3.10.5节保证:

每个字符串文字都是类String(第4.3.3节)的实例(第4.3.1节,第12.5节)的引用(第4.3节).String对象具有常量值.字符串文字 - 或者更一般地说,作为常量表达式(第15.28节)的值的字符串 - 是"实例化"以便使用String.intern方法共享唯一实例.