Страницы

Поиск по вопросам

четверг, 11 апреля 2019 г.

Строковая переменная с одинаковым значениям в двух случаях обрабатывается по разному. Почему? [дубликат]

На данный вопрос уже ответили: Как работает оператор == 1 ответ Почему этот код вызывает блок if?
String word = ""; String push = "push"; Scanner s = new Scanner(System.in); while(true) { word = push; if (word == "push") { n = 3; push(n); System.out.println(""); } }
А этот код нет, хотя через дебаггер проверял что там, что там "word" переменная принимает значение "push".
String word = ""; String push = "push"; Scanner s = new Scanner(System.in); while(true) { word = s.nextLine(); if (word == "push") { n = 3; push(n); System.out.println(""); } }


Ответ

В чем заключается проблема:
Вы сравниваете строки посредством оператора ==, который просто сравнивает на равенство ссылки на объекты, а не их содержимое (за исключением примитивов).
Ссылки на объекты не равны из-за интернирования строк (т.е. из-за использования String pool). В вашем случае строки, получающиеся сложением/присваиванием констант, вычисляются во время компиляции и далее строковые литералы (в одном/разных классе(ах) и в одном/разных пакете(ах)) представляют собой ссылки на один и тот же объект. Именно поэтому в первом случае ссылки оказываются равны, а во втором нет, так как метод nextLine() возвращает ссылку на строку не из пула.
Подробнее о том, как работает оператор == можно посмотреть здесь

Пути решения:
Сравнивайте строки посредством метода equals
if ("push".equals(word))
Причем, в вашем случае, метод применяйте к строковому литералу, так как если применить к переменной word, которая может оказаться null, то вылетит исключение.

Чисто для информации:
Также корректно отработает вариант, при котором вы принудительно засунете второй объект в пул посредством метода intern
if ("push" == word.intern())
Тот факт, что данный метод отработает корректно в вашем случае совсем не означает, что так и следует делать!

Комментариев нет:

Отправить комментарий