Вопрос: String intern puzzles [дубликат]


Возможный дубликат:
intern () ведет себя по-разному в Java 6 и Java 7  

На этом блог  Я нашел интересные головоломки String:

--- Цитата

String te = "te", st = "st";
//"test".length();
String username = te + st;
username.intern();
System.out.println("String object the same is: " 
   + (username == "test"));

распечатывается под обновлением Java 7 7.

String object the same is: true

но раскомментируйте «test» .length (); или запустить с помощью Java 6, и он печатает

String object the same is: false

--- EoQ ---

Будучи честным, я не понимаю, почему результаты разные. Не могли бы вы объяснить мне, в чем причина такого поведения?


15


источник


Ответы:


Вам необходимо присвоить интернированную строку имени пользователя:

String username = te + st;
username = username.intern();

В этом случае оба кода будут выводиться true,

Вот еще один интересный пример:

final String te = "te", st = "st";
"test".length();
String username = (te + st);
System.out.println("String object the same is: " + (username == "test"));

также печатает истину, потому что те и st отмечены как окончательные. Таким образом, имя пользователя становится константой времени компиляции и автоматически интернируется.

РЕДАКТИРОВАТЬ

Поскольку несколько человек указали, что ваш код печатает false с Java 6, даже если "test".length строка прокомментирована.

Это связано с одно из изменений, внесенных в Java 7 :

в JDK 7 интернированные строки больше не выделяются в постоянном поколении кучи Java, а вместо этого выделяются в основной части кучи Java (так называемые молодые и старые поколения) вместе с другими объектами, созданными приложением ,

Одним из следствий является то, что код, который вы опубликовали, имеет разные результаты в Java 6 и 7  (см. пример в нижней части отчета об ошибке).


14



Пожалуйста, проверьте ответ Изменяет ли ссылка String.intern () исходную строку

Изменяется не строка, а объект, который используется для «теста», который изменяется.

Так что в вашем случае, если "test" определяется первым, что означает, что если вы сделаете первый "test".length(); тогда "test" находится в пуле строк, поэтому первый результат false,

Теперь if you comment this line затем после вызова username.intern(); «test» добавляется в пул строк теперь следующий "test" который вы используете для сравнения, получает тот же объект, который был помещен username.intern(); метод. Следовательно, это true

так

Commented //"test".length(); -> True
Un Commented "test".length(); --> False

5