Java7-String.intern()行为
我读过关于如何检查字符串是否在Java中插入的内容,但我不理解以下结果: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
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的字符串。我想,像这样一个看似简单的问题,如果没有长时间的解释,仅仅用一行代码是不可能回答的:)