Операторы сравнения в Java
Результатом выполнения операторов сравнения в Java всегда является логическое значение — true или false. Чаще всего операторы сравнения применяются в выражениях, управляющих условным оператором if и различными операторами цикла.
Таблица операторов сравнения
В Java шесть операторов сравнения. Два из них проверяют равенство, четыре — порядок:
| Оператор | Описание | Пример | Результат |
|---|---|---|---|
| == | Равно | 5 == 5 | true |
| != | Не равно | 5 != 5 | false |
| > | Больше | 4 > 1 | true |
| < | Меньше | 4 < 1 | false |
| >= | Больше или равно | 3 >= 3 | true |
| <= | Меньше или равно | 2 <= 1 | false |
Операторы сравнения в условиях и циклах
Результат сравнения можно сохранить в переменную типа boolean или использовать напрямую как условие:
int a = 4;
int b = 1;
boolean result = a < b;
System.out.println(result); // false
На практике сравнения чаще всего встречаются внутри оператора if и в условиях циклов:
int temperature = 25;
if (temperature >= 20) {
System.out.println("Достаточно тепло");
}
for (int i = 0; i < 3; i++) {
System.out.println(i); // печатает 0, 1, 2
}
Операторы равенства: == и !=
Операторы == и != работают с тремя видами пар операндов:
- Числа и char: значения сравниваются численно. Операнды разных числовых типов сначала приводятся к общему типу, поэтому
5 == 5.0даётtrue. - Логические значения: два значения
booleanможно сравнивать между собой, но не с числами — выражениеtrue == 1в Java не компилируется. - Ссылки: для объектов
==проверяет, указывают ли две ссылки на один и тот же объект в памяти, а не совпадает ли содержимое объектов.
String s1 = new String("Java");
String s2 = new String("Java");
System.out.println(s1 == s2); // false: два разных объекта
System.out.println(s1.equals(s2)); // true: одинаковые символы
Операторы упорядочения: >, <, >=, <=
Операторы упорядочения >, <, >=, <= допускаются только для примитивных числовых типов: byte, short, int, long, float, double, а также char. Символы сравниваются по их числовым кодам (Unicode):
char letter = 'B';
System.out.println(letter > 'A'); // true: 66 > 65
Применять операторы упорядочения к значениям boolean или к объектам нельзя. Чтобы упорядочить строки или другие объекты, используйте метод compareTo():
String x = "apple";
String y = "banana";
System.out.println(x.compareTo(y) < 0); // true: "apple" идёт раньше
Типичные ловушки
Три сравнения регулярно удивляют Java-разработчиков:
// 1. Дробные числа хранятся неточно
System.out.println(0.1 + 0.2 == 0.3); // false
// 2. NaN не равен ничему, включая самого себя
System.out.println(Double.NaN == Double.NaN); // false
// 3. Кэширование объектов Integer
Integer i1 = 127, i2 = 127;
Integer j1 = 128, j2 = 128;
System.out.println(i1 == i2); // true: объекты из кэша
System.out.println(j1 == j2); // false: разные объекты
Дробные числа сравнивайте с небольшой погрешностью (эпсилон) или используйте BigDecimal; для Double.NaN применяйте Double.isNaN(); классы-обёртки, такие как Integer, сравнивайте через equals().
Часто задаваемые вопросы
Чем отличается == от equals() в Java?
Для примитивных типов == сравнивает значения. Для объектов == сравнивает ссылки, то есть проверяет, указывают ли обе переменные на один и тот же объект, а equals() сравнивает логическое содержимое объектов. Поэтому две разные строки String с одинаковым текстом равны по equals(), но не равны по ==.
Можно ли сравнивать строки и другие объекты операторами < и >?
Нет. Операторы упорядочения работают только с примитивными числовыми типами и char. Применение их к объектам — ошибка компиляции. Для упорядочения строк используйте compareTo(): отрицательный результат означает, что первая строка идёт раньше лексикографически.
Почему 0.1 + 0.2 == 0.3 возвращает false в Java?
Тип double хранит числа в двоичном виде, поэтому 0.1 и 0.2 не представляются точно, и их сумма равна 0.30000000000000004. Сравнивайте дробные значения с небольшой погрешностью, например Math.abs(a - b) < 1e-9, или используйте BigDecimal для точных вычислений.
Почему == возвращает false для двух одинаковых Integer, например 128?
При автоупаковке Java переиспользует кэшированные объекты Integer только для значений от минус 128 до 127. Внутри этого диапазона == случайно даёт true, потому что обе ссылки указывают на один кэшированный объект; вне диапазона создаются два разных объекта, и == возвращает false. Объекты-обёртки всегда сравнивайте через equals().
Презентацию с видео можно скачать на Patreon.
Видео объяснение
Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.
Комментарии