Java 7 - String.intern()行为

A. *_*das 4 java string pool java-7

我已经阅读了关于如何检查字符串是否在Java中实现的答案,但我不理解以下结果:

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

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

String x = "abc";
String a = "a";
String y = a + "bc";
System.out.println(y.intern() == y); // false
Run Code Online (Sandbox Code Playgroud)

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

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

为什么y.intern() == y更改取决于是否x是文字,即使是在使用命令行参数时的示例?

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

编辑:

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

Hen*_*nry 6

这是因为,y.intern()还给y如果字符串不前拘留.如果字符串已经存在,则调用将返回已经存在的实例,该实例很可能与之不同y.

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