Кажется, что JDK7 обрабатывает интерна другим способом, как прежде.
Я протестировал его со сборкой 1.7.0-b147 и получил «оба равны», но при выполнении этого (тот же байт-код) с 1,6.0_24 я не получаю сообщение.
Это также зависит от того, где в исходном коде находится строка String b2 =...
. Следующий код также не выводит сообщение:
class Test {
public static void main(String... args) {
String s1 = "Good";
s1 = s1 + "morning";
String s2 = "Goodmorning";
System.out.println(s1.intern()); //just changed here s1.intern() and the if condition runs true
if(s1 == s2) {
System.out.println("both are equal");
} //now it works.
}
}
похоже, что intern
после того, как не найдет String в его пуле строк, вставляет фактический экземпляр s1 в пул. JVM использует этот пул при создании s2, поэтому он получает ту же ссылку, что и s1. С другой стороны, если сначала создается s2, эта ссылка сохраняется в пуле.
Это может быть результатом перемещения внутренних строк из постоянного поколения кучи Java.
Найдено здесь: Важные RFE, адресованные в JDK 7
В JDK 7 встроенные строки больше не выделяются в постоянном поколении кучи Java, а вместо этого выделяются в основной части кучи Java (известной как молодое и старое поколения) вместе с другими созданными объектами по заявке. Это изменение приведет к увеличению объема данных, находящихся в основной куче Java, и уменьшению объема данных в постоянной генерации, что может потребовать корректировки размеров кучи. Большинство приложений увидят только относительно небольшие различия в использовании кучи из-за этого изменения, но более крупные приложения, которые загружают много классов или интенсивно используют метод String.intern (), увидят более существенные различия.
Не уверен, что это ошибка и с какой версии ... JLS 3.10.5 заявляет
Результатом явного интернирования вычисленной строки является та же строка, что и любой ранее существовавшей литеральной строкой с таким же содержимым.
поэтому вопрос заключается в том, как интерпретируется существующее ранее, время компиляции или время выполнения: "Goodmorning" уже существует или нет?
Я предпочитаю, чтобы это было реализовано до 7 ...