Добрый день. ссылка на страницу: https://javarush.com/groups/posts/equals-java-sravnenie-strok
Объяснение вывода на консоль "true" следующее: Была проведена проверка, что ссылка s1 и ссылка, возвращенная методом s2.intern() указывают на одну область в памяти, и, конечно, так оно и есть:)
Вопрос как так может быть, что ссылка, возвращенная методом s2.intern() указывает на одну область в памяти со ссылкой s1? Ведь ссылки s1 и s2 ссылаются на два разных объекта, у них разные области в памяти и объект s2 не находится в String Poolе.
В этой лекции этот вопрос был объяснен следующим образом:
Возможно я что-то не правильно понял, если так, то объясните, пожалуйста.
Дмитрий
1 уровень
вопрос по применению метода intern()
Обсуждается
Комментарии (4)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Рин Backend Developer
25 ноября 2023, 17:42полезный
Смотри, когда ты создаешь строку присваиванием, то есть String string1="строка", эта "строка" отправляется в пул, и наша строка string1 ссылается на эту строку в пуле.
Если ты создашь вторую строку присваиванием String string2="строка", то так как в пуле уже есть такая строка, string2 будет ссылаться на нее же, и при сравнивании ты получишь true
А если ты создаешь через "new" String string3 = new String("строка"), то она у тебя лежит отдельно и в пул не кладется. Однако ее можно туда "запихнуть" методом intern(). Он смотрит, есть ли в пуле такая же строка, и если нет, то кладет туда нашу строку. В любом случае, в пуле обязательно будет ровно одна такая строка. И вот на нее-то метод intrern() и вернет ссылку.
То есть, в данном случае сначала в пул кладется строка string1.
Потом строка string2 будет ссылаться на нее же, поскольку при инициализации обнаружится, что такая строка в пуле уже есть.
Потом строка string3 создается отдельным объектом, на нее своя ссылка, поскольку мы объявили ее через new.
Ну и string3.intern() заглянет в пул, обнаружит, что такая строка там уже есть, и вернет ссылку на эту строку из пула.
Надеюсь, я тебя не запутала еще больше))
+1
ГоффMaster
25 ноября 2023, 20:36полезный
Отлично объяснила!
Добавлю, что, если строка string НЕ лежит в пуле, то string == string.intern() всегда будет false - что вполне логично.
+1
Дмитрий
26 ноября 2023, 10:24
Спасибо за подробное объяснение! Теперь стало понятно, в лекции так и было написано, просто сразу не понял суть.
0
Дмитрий
26 ноября 2023, 10:24
Спасибо!
0