首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java7- String.intern()行为

Java7- String.intern()行为
EN

Stack Overflow用户
提问于 2013-02-23 18:20:21
回答 2查看 439关注 0票数 4

我读过这个答案关于如何检查字符串是否在Java中内嵌的内容,但我不理解以下结果:

代码语言:javascript
复制
String x = args[0]; // args[0] = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // true

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

代码语言:javascript
复制
String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false

此外,没有任何字符串文字,args[0]似乎是直接被嵌入的:

代码语言:javascript
复制
// 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是否为文字而改变,即使在使用命令行参数时也是如此?

我知道文本字符串在编译时被嵌入。,但我不明白为什么在前面的例子中它会产生影响。我还读过几个关于字符串实习的问题,比如https://stackoverflow.com/questions/14490043/string-pool-behaviorhttps://stackoverflow.com/questions/1881922/questions-about-javas-string-poolhttps://stackoverflow.com/questions/14447637/java-string-pool-when-does-the-pool-change。然而,他们都没有对这种行为作出可能的解释。

编辑:

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-02-23 18:28:27

这是因为如果字符串以前没有被嵌入,y.intern()会返回y。如果字符串已经存在,调用将返回已经存在的实例,这很可能与y不同。

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

票数 6
EN

Stack Overflow用户

发布于 2013-02-23 18:52:07

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

第二种情况是VM自动实习生文本,以便y.intern()返回对x的引用,这与y不同。

最后一种情况再次发生,因为默认情况下不存在任何内容,因此对intern()的调用返回对y的引用。我认为更积极地进行字符串实习生是合法的,但据我理解,这是规范所要求的最小行为。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15043926

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档