我已经阅读了有关如何检查字符串是否在 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";
,但它确实会改变。