Операторы сравнения в Java - Вопросы
Всего: 5 вопросов
1. Чем отличается оператор == от метода equals() в Java?
Чем отличается оператор == от метода equals() в Java?
Для примитивных типов == сравнивает значения. Для объектов == сравнивает ссылки, то есть проверяет, указывают ли обе переменные на один и тот же объект в памяти, а equals() сравнивает логическое содержимое объектов. Поэтому две разные строки с одинаковым текстом равны по equals(), но не равны по ==.
2. Можно ли применять операторы <, >, <=, >= к строкам и другим объектам в Java?
Можно ли применять операторы <, >, <=, >= к строкам и другим объектам в Java?
Нет. Операторы упорядочения работают только с примитивными числовыми типами (byte, short, int, long, float, double) и char. Для объектов это ошибка компиляции. Строки и другие объекты упорядочивают методом compareTo(): отрицательный результат означает, что первый объект идёт раньше.
3. Почему в Java выражение 0.1 + 0.2 == 0.3 возвращает false?
Почему в Java выражение 0.1 + 0.2 == 0.3 возвращает false?
Тип double хранит числа в двоичном виде, поэтому 0.1 и 0.2 не представляются точно: их сумма равна 0.30000000000000004. Дробные значения сравнивают с небольшой погрешностью, например Math.abs(a - b) < 1e-9, либо используют BigDecimal для точных вычислений.
4. Чему равно выражение Double.NaN == Double.NaN и почему?
Чему равно выражение Double.NaN == Double.NaN и почему?
false. По стандарту IEEE 754 значение NaN (not a number) не равно ничему, включая самого себя. Чтобы проверить, является ли значение NaN, используйте метод Double.isNaN().
5. Почему == может вернуть false для двух одинаковых значений Integer?
Почему == может вернуть false для двух одинаковых значений Integer?
При автоупаковке Java кэширует объекты Integer только для значений от -128 до 127. Внутри диапазона обе ссылки указывают на один кэшированный объект и == даёт true, а вне диапазона создаются два разных объекта и == возвращает false. Объекты-обёртки нужно сравнивать через equals().