Выбор ответа Middle Задачи на Java обновлено

Компаратор через вычитание

Вопрос

Почему компаратор (a, b) -> a - b для Integer опасен?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Вычитание переполняется на больших по модулю числах, и знак врёт. a - b при a = 2·10⁹ и b = -2·10⁹ выходит за пределы int, результат меняет знак, и сортировка ломается непредсказуемо.

Варианты ответа

  1. Он сортирует по убыванию, а не по возрастанию, как ожидают
  2. Он не работает с отрицательными числами вообще и бросает исключение
  3. Вычитание переполняется на больших по модулю числах, и знак врётправильный ответ
  4. Лямбда не может быть компаратором для Integer, нужен отдельный класс

Разбор

a - b при a = 2·10⁹ и b = -2·10⁹ выходит за пределы int, результат меняет знак, и сортировка ломается непредсказуемо. Правильно Integer.compare(a, b) или Comparator.comparingInt(...). Порядок при этом по возрастанию, а с отрицательными малыми числами он работает, поэтому ошибка и коварна.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.