#java
На этот вопрос уже дан ответ здесь: Как работает оператор проверки на равенство (оператор ==) (1 ответ) Закрыт 3 года назад. Почему этот код вызывает блок 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(""); } }
Ответы
Ответ 1
В чем заключается проблема: Вы сравниваете строки посредством оператора ==, который просто сравнивает на равенство ссылки на объекты, а не их содержимое (за исключением примитивов). Ссылки на объекты не равны из-за интернирования строк (т.е. из-за использования String pool). В вашем случае строки, получающиеся сложением/присваиванием констант, вычисляются во время компиляции и далее строковые литералы (в одном/разных классе(ах) и в одном/разных пакете(ах)) представляют собой ссылки на один и тот же объект. Именно поэтому в первом случае ссылки оказываются равны, а во втором нет, так как метод nextLine() возвращает ссылку на строку не из пула. Подробнее о том, как работает оператор == можно посмотреть здесь. Пути решения: Сравнивайте строки посредством метода equals: if ("push".equals(word)) Причем, в вашем случае, метод применяйте к строковому литералу, так как если применить к переменной word, которая может оказаться null, то вылетит исключение. Чисто для информации: Также корректно отработает вариант, при котором вы принудительно засунете второй объект в пул посредством метода intern if ("push" == word.intern()) Тот факт, что данный метод отработает корректно в вашем случае совсем не означает, что так и следует делать!Ответ 2
Потому что вы пытаетесь использовать == для проверки строк на эквивалентность и это неправильно. Используйте equalsОтвет 3
Переменные String необходимо сравнивать методом equals if (word.equals("push")) Во втором случае код работает чисто случайно, т.к. совпадают адреса объектов String word = ""; String push = "push"; //push указывает на объект String в памяти, содержащий символы "push" Scanner s = new Scanner(System.in); while(true) { word = push; //word теперь указывает на тот же самый объект word = s.nextLine(); //создается новый обект String в другом участке памяти и wodr указывает на него if (word == "push") //проверка, указывает ли word на первоначальный String из инициализации push { n = 3; push(n); System.out.println(""); } }
Комментариев нет:
Отправить комментарий