我一直在使用JShell只是为了对其进行测试,今天我遇到了相当有趣的行为。

jshell> String a = "A"
a ==> "A"

jshell> String b = "A"
b ==> "A"

jshell> a == b
$4 ==> true

jshell> "A" == "A"
$5 ==> true


我首先想知道这是否是Java 9的功能,然后通过使用Java 9编译并运行该程序来进行检查

public class Equus {
    public static void main(String... args) {
        String a = "A";
        String b = "A";
        System.out.println("a == b");
        System.out.println(a == b);
        System.out.println("\"A\" == \"A\"");
        System.out.println("A" == "A");
    }
}


有趣的是我得到了


a == b
true
"A" == "A"
true



作为我的输出。这里发生了什么?为什么ab彼此相等,为什么"A" == "A"为true?

最佳答案

为什么不呢?在以前的Java版本中也表现出了这种行为-字符串常量被插入。

如您所知,==检查引用是否相等-两个变量具有相同的内存地址。插入String时,该字符串的所有引用都指向内部缓冲池,因此使用==相等。

10-08 00:24