Страницы

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

суббота, 8 февраля 2020 г.

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

#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(""); } }

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

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