我已经阅读了关于如何在Java中检查字符串是否被intern的答案,但是我不理解以下结果:
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
是字面量还是非字面量而改变,即使在使用命令行参数的示例中也是如此?我知道字面量字符串在编译时被interned,但我不明白为什么它会影响前面的示例。我也阅读了一些关于字符串interning的问题,例如String Pool behavior、Questions about Java's String pool和Java String pool - When does the pool change?。然而,它们都没有给出这种行为的可能解释。 编辑: 我错误地写道,在第三个示例中,如果声明
String x = "abc";
,结果不会改变,但实际上会改变。
intern()
也不能保证返回原始字符串--它可能会返回一个副本。 - Hot Licks