Java7-String.intern()行为

Java7-String.intern()行为,java,string,java-7,pool,Java,String,Java 7,Pool,我读过关于如何检查字符串是否在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

我读过关于如何检查字符串是否在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
是否为文本而变化,即使在使用命令行参数的示例中也是如此

我知道,但我不明白为什么它会影响前面的例子。我也读过一些关于弦乐实习的问题,比如,和。然而,他们都没有对这种行为给出可能的解释

编辑:


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

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


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

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

第二种情况是VM自动插入文本,因此
y.intern()
返回对
x
的引用,这与
y
不同

最后一种情况再次发生,因为默认情况下不进行任何内部调用,因此对
intern()
的调用返回对
y
.
我相信更积极地插入字符串是合法的,但据我所知,这是规范要求的最低行为。

我在所有情况下都为false如果编译器“欺骗”并结合第二和第三个赋值,那么在第二种情况下你可以得到“true”(考虑到Java的规则,这充其量只是“合法的”).这种行为有点吓人…@HotLicks-只有当变量被声明为final时才这样做。@MartijnCourteaux-不知道你为什么说“吓人”。一个给定的字符串值可能已经或可能还没有被截取——一个小时前可能在另一个方法中。而且,
intern()
不能保证返回原始字符串,即使它是第一个这样的字符串——它可能会返回一个副本。那么,当字符串已经被插入时,这是否意味着
y.intern()==y
为false?如果一个等于y但又是另一个实例的字符串已经被插入,你会得到false。如果以前实习过与
y
相同的实例,您将得到正确答案。如果之前没有插入任何等于
y
的字符串,也会得到true。它确实与答案相矛盾,但答案中的代码是错误的。应该是
=
检查它是否已经被占用。@Jochen这取决于答案是指
myString
实例还是一个等于
myString
@True的字符串。我想,像这样一个看似简单的问题,如果没有长时间的解释,仅仅用一行代码是不可能回答的:)