Операторы Java
Полный обзор операторов Java — арифметических, присваивания, сравнения, логических, побитовых и тернарных — с примерами использования.
Операторы — это небольшие символы, позволяющие выполнять действия со значениями: складывать их, сравнивать, объединять булевы проверки, управлять битами, выбирать между двумя выражениями. Эта глава представляет собой обзор всех категорий операторов Java — у каждой из них есть отдельная глава с более подробным рассмотрением.
Категории
Операторы Java разделены на семь групп:
| Категория | Операторы | Назначение |
|---|---|---|
| Арифметические | + - * / % | Математические вычисления |
| Унарные | + - ++ -- ! | Знак, инкремент/декремент, логическое NOT |
| Присваивания | = += -= *= /= %= &= |= ^= <<= >>= >>>= | Задание значения переменной |
| Сравнения | == != > < >= <= | Сравнение значений |
| Логические | && || ! | Объединение булевых значений |
| Побитовые | & | ^ ~ << >> >>> | Операции с битами |
| Тернарный | ? : | Встроенное условное выражение |
Также существуют instanceof (проверка типа) и new (создание объекта), которые ведут себя как операторы, но привязаны к конкретным языковым возможностям.
Арифметические
Пять арифметических операторов работают так же, как в любом языке, с одной особенностью:
int sum = 7 + 3; // 10
int diff = 7 - 3; // 4
int product = 7 * 3; // 21
int quotient = 7 / 3; // 2 ← integer division truncates
int remainder = 7 % 3; // 1Для деления с вещественным результатом хотя бы один из операндов должен быть типа double (или приведён к нему). Подробнее см. Арифметические операторы Java.
Унарные
int x = 5;
int neg = -x; // -5
int inc = ++x; // pre-increment: x becomes 6, inc is 6
int post = x++; // post-increment: post is 6, then x becomes 7
boolean b = !true; // false++ и -- существуют в префиксной и постфиксной форме. Префикс изменяет переменную, а затем возвращает новое значение; постфикс возвращает старое значение, а затем изменяет переменную. По возможности используйте их отдельной строкой — встроенные в выражения, они часто становятся источником ошибок.
Присваивания
Базовое присваивание — =. Составные формы объединяют операцию с присваиванием:
int total = 0;
total += 5; // total = total + 5
total *= 2; // total = total * 2
total -= 1; // total = total - 1Составные формы работают и с побитовыми операторами (&= |= ^=), и со сдвигами (<<= >>= >>>=). Составное присваивание также выполняет неявное приведение к типу переменной, поэтому byte b = 10; b += 5; компилируется, хотя b + 5 является int — простой b = b + 5; не скомпилировался бы. Подробнее см. Операторы присваивания Java.
Сравнения
boolean a = (5 > 3); // true
boolean b = (5 == 5); // true
boolean c = (5 != 5); // false== работает как с примитивами, так и со ссылками. Для ссылок он проверяет идентичность объектов (один и тот же объект в памяти), а не равенство содержимого. Для сравнения содержимого объектов используйте .equals():
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false — different objects
System.out.println(s1.equals(s2)); // true — same contentsЭто ловушка для всех новичков. В главе Операторы сравнения Java объясняется, почему.
Логические
Три логических оператора объединяют булевые значения:
boolean a = true && false; // false
boolean b = true || false; // true
boolean c = !true; // false&& и || используют короткое замыкание — они прекращают вычисление, как только результат становится известен. Это важно, когда одна из сторон может вызвать исключение:
if (list != null && list.size() > 0) { /* ... */ } // safe — short-circuitПоскольку && останавливается при первом false, list.size() никогда не вызывается, когда list равен null, что исключает NullPointerException. В главе Логические операторы Java подробно рассматривается короткое замыкание и формы &/| без короткого замыкания.
Побитовые
Для манипуляций с отдельными битами:
int and = 0b1100 & 0b1010; // 0b1000 = 8
int or = 0b1100 | 0b1010; // 0b1110 = 14
int xor = 0b1100 ^ 0b1010; // 0b0110 = 6
int not = ~0; // -1 — all bits flipped
int left = 1 << 4; // 16 — shift left
int right = 16 >> 2; // 4 — shift right (sign-preserving)
int uright = -1 >>> 28; // 15 — unsigned shift rightВ повседневном коде на Java они используются в основном для флагов, хеширования и низкоуровневого ввода-вывода. Подробнее в главе Побитовые операторы Java.
Тернарный
Тернарный оператор выбирает между двумя выражениями:
int x = 10;
String parity = (x % 2 == 0) ? "even" : "odd"; // "even"Он возвращает значение, поэтому наиболее удобен как правая часть присваивания или внутри более крупного выражения. Для многоэтапных решений используйте обычный if/else для лучшей читаемости.
Приоритет операторов
Когда в одном выражении встречается несколько операторов, Java вычисляет их в фиксированном порядке. Наиболее важные приоритеты, от высшего к низшему:
++,--, унарный-,!,~*,/,%+,-<<,>>,>>><,<=,>,>=,instanceof==,!=&(bitwise AND)^(bitwise XOR)|(bitwise OR)&&||? :=,+=,-=, etc.
Если сомневаетесь — добавьте скобки. Во время выполнения они ничего не стоят и делают намерение очевидным для следующего читателя.
Демонстрация
Что дальше
В следующих главах подробно рассматривается каждая группа операторов. Следующая глава — Арифметические операторы Java.