Страницы

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

среда, 29 января 2020 г.

Почему результат сравнения строк неправильный?

#java


Сравниваю так:

String s = "-123";
Boolean y = false;
if ("-".equals(s.charAt(0))){
    y = true;
}


Результат: y=false

Почему?
    


Ответы

Ответ 1



Потому что Вы сравниваете разные типы. Метод charAt(...) возвращает значение типа char, которое автоупаковывается в объектный Character и Вы этот объект сравниваете со объектом типа String, в результате несовпадения типов Вы и получаете такой результат. Посмотрите исходный код метода String.equals(...): public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; } Первое условие ложно, второе – тоже ложно, в результате метод возвращает false. Добиться желаемого поведения, можно, например, так: if ("-".equals(String.valueOf(s.charAt(0)))){ y = true; } UPD: Мне нужно узнать, есть ли в строке определенный символ? String s = "123"; char c = '2'; boolean contains = s.contains(String.valueOf(c)); или так: String s = "123"; String c = "2"; boolean contains = s.contains(c);

Ответ 2



Метод .charAt() ожидаемо возвращает не String, а char, который упаковывается (boxing) в класс Character. Character сам по себе не равен строке, даже если строка состоит из одного этого символа - это было бы неверно даже семантически, потому что строка, например, реализует интерфейс CharSequence.

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

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