На данный вопрос уже ответили:
Как работает оператор ==
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())
Тот факт, что данный метод отработает корректно в вашем случае совсем не означает, что так и следует делать!
Комментариев нет:
Отправить комментарий