Java 运算符详解:算术、逻辑、位运算及优先级
Java 中的各类运算符,涵盖算术、关系、逻辑、位、移位及条件运算符。内容包含运算符定义、分类、具体语法及代码示例。重点解析了增量与自增自减的区别、逻辑短路求值机制、位运算的二进制原理以及移位运算的效率优势。同时强调了类型自动提升、除零异常处理、运算符优先级规则及条件表达式的类型一致性要求,旨在帮助开发者准确掌握 Java 基础运算逻辑与最佳实践。

Java 中的各类运算符,涵盖算术、关系、逻辑、位、移位及条件运算符。内容包含运算符定义、分类、具体语法及代码示例。重点解析了增量与自增自减的区别、逻辑短路求值机制、位运算的二进制原理以及移位运算的效率优势。同时强调了类型自动提升、除零异常处理、运算符优先级规则及条件表达式的类型一致性要求,旨在帮助开发者准确掌握 Java 基础运算逻辑与最佳实践。

定义:对操作数进行操作的符号,不同运算符操作含义不同。 Java 运算符分类:算术运算符、关系运算符、逻辑运算符、位运算符、移位运算符、条件运算符。
分为基本四则运算符、增量运算符、自增/自减运算符,是数值运算的核心。
特点:二元运算符,必须有左右两个操作数。 代码案例:
int a = 20;
int b = 10;
System.out.println(a + b); // 30
System.out.println(a - b); // 10
System.out.println(a * b); // 200
System.out.println(a / b); // 2
System.out.println(a % b); // 0 (模运算=除法余数)
核心注意事项:
操作数类型不一致时,向范围大的类型自动提升:
System.out.println(1 + 0.2); // 1.2(int 自动提升为 double)
% 可对 double 取模(无实际意义,一般仅用于整型),运算结果符合取决于第一个数:
System.out.println(11.5 % 2.0); // 1.5
System.out.println(10 % 3); // 1
System.out.println(-10 % 3); // -1
除法和取模的右操作数不能为 0,否则抛出算术异常:
int a = 1;
int b = 0;
System.out.println(a / b); // 报错:ArithmeticException(算术异常): / by zero
int / int 结果仍为 int,向下取整(舍弃小数点后所有数):
int a = 3;
int b = 2;
System.out.println(a / b); // 1(非 1.5)
// 想得到数学精确结果,需将其中一个数转为浮点型
double d = a * 1.0 / b;
System.out.println(d); // 1.5
特点:运算结果自动赋值给左操作数,仅支持变量,不支持常量;可帮你进行类型转换。 代码案例:
int a = 1;
a += 2; // 等价于 a = a + 2 → a=3
System.out.println(a);
a -= 1; // 等价于 a = a - 1 → a=2
System.out.println(a);
a *= 3; // 等价于 a = a * 3 → a=6
System.out.println(a);
a /= 3; // 等价于 a = a / 3 → a=2
System.out.println(a);
a %= 3; // 等价于 a = a % 3 → a=2
System.out.println(a);
int c = 10;
long d = 20;
c += d;
System.out.println(c); // 30
作用:++ 给变量 +1,-- 给变量 -1;仅支持变量,不支持常量。
核心区别:单独使用无区别,混合使用有先后顺序。
代码案例:
int a = 1;
a++; // 后置 ++,单独使用 → a=2
++a; // 前置 ++,单独使用 → a=3
// 混合使用:后置 ++ 先使用原值,表达式结束后 +1
System.out.println(a++); // 输出 3,执行后 a=4
// 混合使用:前置 ++ 先 +1,再使用新值
System.out.println(++a); // 先 a=5,再输出 5
// 自减 -- 规则与自增 ++ 完全一致
a--;
System.out.println(a--); // 输出 4,执行后 a=3
--a;
System.out.println(--a); // 先 a=1,再输出 1
常用符号:== != < > <= >=(共 6 个)
核心特点:运算结果为布尔值(true/false);= 是赋值,== 才是判断相等。
代码案例:
int a = 10;
int b = 20;
System.out.println(a == b); // false
System.out.println(a != b); // true
System.out.println(a < b); // true
System.out.println(a > b); // false
System.out.println(a <= b); // true
System.out.println(a >= b); // false
关键注意:不能连续写多个关系运算符(与数学不同),如 3 < a < 5 是错误写法。
常用符号:&& || !(逻辑与、逻辑或、逻辑非)
核心特点:操作数为布尔值,运算结果也为布尔值;&& 和 || 支持短路求值。
规则:左右表达式都为 true,结果才为 true;任意一个为 false,结果为 false。 代码案例:
int a = 1;
int b = 2;
System.out.println(a == 1 && b == 2); // true(全真)
System.out.println(a == 1 && b > 100); // false(右假)
System.out.println(a > 100 && b == 2); // false(左假)
System.out.println(a > 100 && b > 100); // false(全假)
规则:左右表达式任意一个为 true,结果为 true;都为 false 时,结果为 false。 代码案例:
int a = 1;
int b = 2;
System.out.println(a == 1 || b == 2); // true(全真)
System.out.println(a == 1 || b > 100); // true(左真)
System.out.println(a > 100 || b == 2); // true(右真)
System.out.println(a > 100 || b > 100); // false(全假)
规则:一元运算符,仅对一个布尔表达式取反。 代码案例:
int a = 1;
System.out.println(!(a == 1)); // false(原 true 取反)
System.out.println(!(a != 1)); // true(原 false 取反)
规则:&& 左侧为 false 时,直接返回 false,不计算右侧表达式;|| 左侧为 true 时,直接返回 true,不计算右侧表达式。
代码案例(无异常,因右侧未执行):
// 10/0 会抛异常,但此处因短路求值未执行
System.out.println(10 > 20 && 10 / 0 == 0); // false
System.out.println(10 < 20 || 10 / 0 == 0); // true
对比:& 和 | 作逻辑运算时不支持短路求值,会执行所有表达式,直接抛异常:
System.out.println(10 > 20 & 10 / 0 == 0); // 报错
System.out.println(10 < 20 | 10 / 0 == 0); // 报错
Java 中数据操作最小单位是比特位(0/1),位运算符按二进制位逐位运算;
常用符号:& | ~ ^(按位与、按位或、按位取反、按位异或);除 ~ 是一元运算符,其余为二元。
注意:操作数为整数时是位运算,为布尔值时是逻辑运算(与 && || 区分)。
代码案例:
int a = 10; // 二进制:00001010
int b = 20; // 二进制:00010100
System.out.println(a & b); // 0(二进制:00000000)
System.out.println(10 < 20 & 10 > 0); // 都为真,true
System.out.println(10 > 20 & 10 > 0); // 第一个为假,false
System.out.println(10 < 20 & 10 < 0); // 第二个为假。false
System.out.println(10 > 20 & 10 < 0); // 都为假,false
代码案例:
int a = 10; // 二进制:00001010
int b = 20; // 二进制:00010100
System.out.println(a | b); // 30(二进制:00011110)
代码案例(十六进制简化二进制,%x 按十六进制输出):
int a = 0xf; // 0xf=15,二进制:00001111
System.out.printf("%x\n", ~a); // 按位取反后结果:ffffff0
核心特性:两个相同数异或结果为 0; 代码案例:
int a = 0x1; // 二进制:0001
int b = 0x2; // 二进制:0010
System.out.printf("%x\n", a ^ b); // 3(二进制:0011)
System.out.println(5 ^ 5); // 0(相同数异或为 0)
System.out.println(5 ^ 0); // 5(0 异或任何数为当前那个数)
按二进制比特位移动,都是二元运算符;符号:<< >> >>>(左移、右移、无符号右移)。
规则:左移 N 位 ≈ 原数 × 2 的 N 次方(计算效率高于乘除);
代码案例(0x10 是十六进制,对应十进制 16):
int a = 0x10;
System.out.printf("%x\n", a << 1); // 20(左移 1 位,16×2=32=0x20)
注意:左移会舍弃符号位,正数左移可能变成负数。
规则:右移 N 位 ≈ 原数 ÷ 2 的 N 次方; 代码案例:
int a = 0x10;
System.out.printf("%x\n", a >> 1); // 8(16÷2=8=0x8)
int b = 0xffff0000; // 负数
System.out.printf("%x\n", b >> 1); // ffff8000(左侧补 1)
int c = -1;
System.out.println(c >> 2); // -1
代码案例:
int a = 0xffffffff; // 负数
System.out.printf("%x\n", a >>> 1); // 7fffffff(左侧补 0)
移位通用注意:
唯一符号:表达式 1 ? 表达式 2 : 表达式 3(Java 唯一三目运算符);
作用:简化条件判断,是 if-else 的简写形式。
执行规则:
// 求两个整数的最大值
int a = 10;
int b = 20;
int max = a > b ? a : b;
System.out.println(max); // 20
//强化 boolean flg = true == true ? true == false ? false : true : false;
System.out.println(flg); // true
条件表达式不能单独存在,运算结果必须被使用(赋值/输出等):
int a = 10;
int b = 20;
a > b ? a : b; // 报错:不是有效语句
表达式 2 和表达式 3 的结果类型必须一致(除非支持隐式类型转换):
int a = 10;
int b = 20;
int c = a > b ? 1 : 2.0; // 错误:类型不匹配(int 和 double)
* / 高于 + -,+ - 高于移位运算符);// 求 a 和 b 的平均值,错误写法(+ 优先级高于>>)
int a = 10;
int b = 20;
int c = a + (b - a) >> 1; // 等价于 (10+10)>>1 → 20>>1=10
System.out.println(c); // 10
// 正确写法:加括号明确运算顺序
int d = a + ((b - a) >> 1);
System.out.println(d); // 15

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online