繁体   English   中英

Java 7-String.intern()行为

[英]Java 7 - String.intern() behaviour

我已经阅读了有关如何检查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";结果不会改变String x = "abc"; 被声明,但确实如此。

这是因为如果之前未对该字符串进行过y.intern() ,则y.intern()会返回y 如果字符串已经存在,则调用将返回最可能与y不同的已经存在的实例。

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

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

第二种情况是VM自动实习文本,因此y.intern()返回对x的引用,该引用不同于y

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM