4

我已经阅读了有关如何检查字符串是否在 Java 中被实习的答案,但我不明白以下结果:

String x = args[0]; // args[0] = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // true

但是如果我声明一个字符串文字:

String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false

此外,没有任何字符串文字,args[0]似乎直接被实习:

// String x = "abc";
String y = args[0];
System.out.println(y.intern() == y); // true (???)
// false if the first line is uncommented

为什么会y.intern() == y根据是否x为文字而改变,即使对于使用命令行参数的示例也是如此?

我知道文字字符串在编译时被保留,但我不明白为什么它会影响前面的示例。我还阅读了几个关于字符串实习的问题,例如字符串池行为关于 Java 的字符串池Java 字符串池的问题 - 池何时更改?. 但是,他们都没有对这种行为给出可能的解释。

编辑:

我错误地写道,在第三个示例中,如果声明了结果并不会改变String x = "abc";,但它确实会改变。

4

2 回答 2

6

这是因为如果字符串之前没有被实习过,就会y.intern()返还。y如果字符串已经存在,则调用将返回已经存在的实例,该实例很可能不同于y.

但是,所有这些都高度依赖于实现,因此在不同版本的 JVM 和编译器上可能会有所不同。

于 2013-02-23T18:28:27.837 回答
0

实施细节可能不同。但这正是我所期望的行为。您的第一种情况意味着默认情况下命令行参数不被实习。因此在实习后y.intern()返回对它的引用。y

第二种情况是 VM 自动实习文字,因此y.intern()返回对 的引用x,这与y.

最后一种情况再次发生,因为默认情况下没有任何东西被实习,所以调用intern()返回对y . 我认为更积极地实习 String 是合法的,但据我所知,这是规范要求的最小行为。

于 2013-02-23T18:52:07.193 回答