Объясните, почему здесь нужно использовать именно equals, а не == ???
public class Solution {
public static void main(String[] args) {
compare('a', 'a');
compare('a', 'б');
compare('р', 'в');
compare('ы', 'ы');
}
public static void compare(Character first, Character second) {
if (first.equals(second)) {
System.out.println("равны");
} else if (first > second) {
System.out.println("больше");
} else if (first < second) {
System.out.println("меньше");
} else {
System.out.println("А как такое может быть???");
}
}
}
qpuhuk
27 уровень
Не понятно
Архивный
Комментарии (9)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Misha SaharinExpert
21 июля 2022, 13:58
давай вспомним что делает оператор "=="?
а что делает ".equals()"?
а у нас в задаче ссылки на обьект или обьект?
ты прав)
0
Dmitry Kryukov
17 февраля 2022, 19:08
Согласно документации, распаковка происходит в двух случаях:
1. При передачи значения в метод, который принимает значения примитивного типа.
2. Назначается переменной примитивного типа.
Все математические операторы и операторы сравнения применяются к примитивным типам, и, по сути, являются методами. Поэтому классы-обертки будут разворачиваться.
НО ЕСТЬ НЮАНСЫ!
Операторы '==' и '!=' применяются кк ссылкам, а не к типам.
Поэтому неявно сравнить объекты с их помощью получится не всегда.
Дополнительно есть нюанс у '+': этот оператор перегружен для строк и прлизводит операцию конкатенации (объединение строк).
Если есть вопрос, зачем это все, то ответ прост
+5
Anonymous #2452955
1 марта 2021, 08:23
В десятичной системе:
'а' == 160
'б' == 162
'в' == 235
'р' == 225
'ы' == 241
Мне для понимания помогла эта информация.
0
Eridavahkiin
21 января 2021, 20:44решение
Долго разбиралась, но до меня дошло.
Проверяла отладчиком, в первом вызове метода используются английские буквы 'a' - их численное представление (код) равен 97, что укладывается в кэш (до 127), поэтому ссылки у них одинаковые.
В последнем вызове compare создаются новые объекты, потому что коды уже не укладываются в диапазон, и сравнение дает false, так как объекты разные.
+36
Tallahassee
10 августа 2021, 18:48
Почему у вас в последнем вызове false??? Это не правильно.
У меня equals даёт true в последнем случае compare('ы', 'ы');
first: Character = {Character@499} ы
value: char = 'ы' 1099
second: Character = {Character@500} ы
value: char = 'ы' 1099
У обоих одинаковый номер кода в таблице уникода который сравнивается и это даёт нам true в сравнении, потому что они равны.
+1
Ulukay
22 июля 2023, 00:30
Спасибо!
0
MichaelKosm
30 декабря 2020, 19:48
Типа такого if((int)first == (int)second)
+1
MichaelKosm
30 декабря 2020, 19:46
Привести к (int) да и все. Зачем тут equals. Коды символов ,совпадают , больше или меньше. Валидатор хавает. У кого какие предложения?
0
Wladyslaw Java Developer Master
27 декабря 2020, 16:40
Потому что параметры - ссылочные типы.
И "==" для ссылочных типов будет означать сравнение ссылок.
А при ">","<" произойдет автоанбоксинг, скорее всего.
Но нужно проверять
+2