Выбор ответа Middle Задачи на Java обновлено
Компаратор через вычитание
Вопрос
Почему компаратор (a, b) -> a - b для Integer опасен?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Вычитание переполняется на больших по модулю числах, и знак врёт. a - b при a = 2·10⁹ и b = -2·10⁹ выходит за пределы int, результат меняет знак, и сортировка ломается непредсказуемо.
Варианты ответа
- Он сортирует по убыванию, а не по возрастанию, как ожидают
- Он не работает с отрицательными числами вообще и бросает исключение
- Вычитание переполняется на больших по модулю числах, и знак врётправильный ответ
- Лямбда не может быть компаратором для
Integer, нужен отдельный класс
Разбор
a - b при a = 2·10⁹ и b = -2·10⁹ выходит за пределы int, результат меняет знак, и сортировка ломается непредсказуемо. Правильно Integer.compare(a, b) или Comparator.comparingInt(...). Порядок при этом по возрастанию, а с отрицательными малыми числами он работает, поэтому ошибка и коварна.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.