2

我一直在使用 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

作为我的输出也是如此。这里发生了什么?为什么彼此相等,为什么是a真的?b"A" == "A"

4

2 回答 2

10

为什么不应该呢?这种行为在以前的 Java 版本中也有表现 - 字符串文字是实习的。

如您所知,==检查引用相等 - 这两个变量具有相同的内存地址。当 String 被实习时,该字符串的所有引用都指向实习池,因此使用==.

于 2017-01-19T18:32:14.063 回答
1

我只是想在 Sinkingpoint 的好答案旁边添加这个演示。
除非您知道每个字符串的来源,否则在字符串上使用是不安全==的,因为以某种方式构建的字符串(例如new String("A")Eli 的评论中的或.toString()此处使用的)不是相同的引用,即使两者确实使用相同的底层字符数组。

class Main
{
  public static void main(String[] args)
  {
    String oneA = "A";
    String twoA = "A";
    String three = new StringBuilder().append('A').toString();

    // We expect constant literals to be ==
    System.out.print("A == A -> ");
    System.out.println("A" == "A");

    // Variables assigned the same literal are also ==
    System.out.print("oneA == twoA -> ");
    System.out.println(oneA == twoA);

    // but a built-up String var is not == to the "literal" var.
    System.out.print("oneA == three -> ");
    System.out.println(oneA == three);

    // If we intern() them they are again ==
    System.out.print("oneA.intern() == three.intern() -> ");
    System.out.println(oneA.intern() == three.intern());

    // and of course, .equals() is always safe.
    System.out.print("oneA .equals three -> ");
    System.out.println(oneA.equals(three));
  }
}

这个(在https://repl.it/languages/java上运行)的输出是:

A == A -> true
oneA == twoA -> true
oneA == three -> false
oneA.intern() == three.intern() -> true
oneA .equals three -> true

您可以安全地使用string1.equals(string2)string1.intern() == string2.intern()

于 2017-01-19T20:49:06.353 回答