выражений, и код ниже ожидаемо возвращает false.
String str1 = "Hello".concat("World");
String str3 = new String("HelloWorld"); //Line-2
String str2 = str1.intern();
System.out.println(str1 == str2); //false
Но если убираем Line-2, то str1 == str2 вернет true.
Почему в этом случае str1 указывает в string pool, а первом варианте не указывает?
Нужно понимать, что из "литералы и константные строковые выражения всегда заинтернены" логически не следует "всё заинтерненное -- это либо литерал, либо константное строковое выражение". А в вашем примере: String str1 = "Hello".concat("World"); String str2 = str1.intern(); // "HelloWorld" в пуле нет, добавляем: то, что мы держим в руках, и есть канонический инстанс "HelloWorld" System.out.println(str1 == str2); // ожидаемо, true String str1 = "Hello".concat("World"); String str3 = new String("HelloWorld"); String str2 = str1.intern(); // "HelloWorld" в пуле есть! Литерал выше. То, что у нас в руках, не есть канонический инстанс, вернётся другая ссылка System.out.println(str1 == str2); // ожидаемо, false
Обсуждают сегодня