Операторы Java ·
‹ Предыдущий Следующий ›
⏱ 5 минут чтения Обновлено: 2026-07-11

Операторы сравнения в 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: одинаковые символы

Важно

Используйте == только для примитивных значений. Для сравнения содержимого объектов — в первую очередь строк — всегда вызывайте метод equals(). Сравнение объектов через == — одна из самых частых ошибок начинающих Java-разработчиков.

Операторы упорядочения: >, <, >=, <=

Операторы упорядочения >, <, >=, <= допускаются только для примитивных числовых типов: 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.

Видео объяснение

Предпочитаете видеоформат? Посмотрите этот урок с примерами и объяснениями.

Комментарии

Зарегистрируйтесь или войдите, чтобы иметь возможность оставить комментарий.