Я прочитал this answer о том, как проверить, если строка интернирован в Java, но я не понимаю, следующие результаты:Java 7 - String.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
литералом или нет, даже для примера, когда используется аргумент командной строки?
Я знаю literal strings are interned at compile time, но я не понимаю, почему это влияет на предыдущие примеры. Я также прочитал несколько вопросов по поводу строки интернирование, как String Pool behavior, Questions about Java's String pool и Java String pool - When does the pool change?. Однако ни одно из них не дает возможного объяснения этому поведению.
Edit:
я ошибочно написал, что в третьем примере результат не изменится, если String x = "abc";
объявлена, но она делает.
Я получаю ложь во всех случаях – aditsu
Вы можете получить «истину» во втором случае, если компилятор должен «обмануть» и объединить 2-е и 3-е задания (что в лучшем случае минимально «легально», учитывая правила Java). –
Такое поведение является пугающим ... –