W3docs

Операторы 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 вычисляет их в фиксированном порядке. Наиболее важные приоритеты, от высшего к низшему:

  1. ++, --, унарный -, !, ~
  2. *, /, %
  3. +, -
  4. <<, >>, >>>
  5. <, <=, >, >=, instanceof
  6. ==, !=
  7. & (bitwise AND)
  8. ^ (bitwise XOR)
  9. | (bitwise OR)
  10. &&
  11. ||
  12. ? :
  13. =, +=, -=, etc.

Если сомневаетесь — добавьте скобки. Во время выполнения они ничего не стоят и делают намерение очевидным для следующего читателя.

Демонстрация

java— editable, runs on the server

Что дальше

В следующих главах подробно рассматривается каждая группа операторов. Следующая глава — Арифметические операторы Java.

Практика

Практика
Какие утверждения об операторах Java верны?
Какие утверждения об операторах Java верны?
Was this page helpful?