文章目录
- 1. Java运算符分类
- 2. Java运算符分类详细介绍
- 2.1 算术运算符
- 2.2 赋值运算符
- 2.3 比较运算符
- 2.4 逻辑运算符
- 2.5 位运算符
- 2.6 条件运算符(三目运算符)
- 2.7 其他运算符
- 3. Java运算符优先级(从高到低)
- 4. 常见问题与解决方案
- 5. 最佳实践
- 6. 总结
1. Java运算符分类
Java 运算符按功能可分为以下几类:
- 算术运算符(+、-、*、/、%、++、–)
- 赋值运算符(=、+=、-=、*=、/=、%= 等)
- 比较运算符(>、<、==、!=、>=、<=)
- 逻辑运算符(&&、||、!)
- 位运算符(&、|、^、~、<<、>>、>>>)
- 条件运算符(? :)
- 其他运算符(instanceof、[]、() 等)
2. Java运算符分类详细介绍
2.1 算术运算符
用于基本数学运算。
| 运算符 | 描述 | 示例 |
|---|---|---|
+ | 加法 | int a = 5 + 3; |
- | 减法 | int b = 5 - 3; |
* | 乘法 | int c = 5 * 3; |
/ | 除法 | int d = 6 / 3; |
% | 取模(余数) | int e = 7 % 3; |
++ | 自增 | int f = 5; f++; |
-- | 自减 | int g = 5; g--; |
注意事项:
- 整数除法:
int / int结果仍为int,小数部分会被截断(如5 / 2结果为2)。 - 类型转换:若操作数类型不同,会向高精度类型转换(如
int + double结果为double)。 - 自增/自减:
- 前缀(
++a):先自增,再返回值。 - 后缀(
a++):先返回值,再自增。
- 前缀(
2.2 赋值运算符
将右侧值赋给左侧变量。
| 运算符 | 描述 | 示例 |
|---|---|---|
= | 简单赋值 | int a = 5; |
+= | 加后赋值 | a += 3;(等价于 a = a + 3) |
-= | 减后赋值 | a -= 3;(等价于 a = a - 3) |
*= | 乘后赋值 | a *= 3;(等价于 a = a * 3) |
/= | 除后赋值 | a /= 3;(等价于 a = a / 3) |
%= | 取模后赋值 | a %= 3;(等价于 a = a % 3) |
注意事项:
- 仅变量可用:赋值运算符左侧必须是变量(如
a += 3),不能是常量(如5 += 3报错)。
2.3 比较运算符
比较两个值,返回布尔结果(true 或 false)。
| 运算符 | 描述 | 示例 |
|---|---|---|
== | 等于 | boolean c = (a == b); |
!= | 不等于 | boolean d = (a != b); |
> | 大于 | boolean e = (a > b); |
< | 小于 | boolean f = (a < b); |
>= | 大于等于 | boolean g = (a >= b); |
<= | 小于等于 | boolean h = (a <= b); |
注意事项:
- 对象比较:
==比较引用地址,equals()比较内容(需重写equals方法)。 - 类型匹配:操作数类型需兼容(如
int与double可比较)。
2.4 逻辑运算符
组合布尔表达式。
| 运算符 | 描述 | 示例 |
|---|---|---|
&& | 逻辑与(短路) | boolean a = true && false; |
|| | 逻辑或(短路) | boolean b = true || false; |
! | 逻辑非 | boolean c = !true; |
注意事项:
- 短路特性:
&&:若左侧为false,右侧不再计算。||:若左侧为true,右侧不再计算。
- 非短路运算符:
&(与)、|(或)会强制计算两侧表达式。
2.5 位运算符
对二进制位进行操作。
| 运算符 | 描述 | 示例 |
|---|---|---|
& | 按位与 | int a = 5 & 3;(结果为 1) |
| | 按位或 | int b = 5 | 3;(结果为 7) |
^ | 按位异或 | int c = 5 ^ 3;(结果为 6) |
~ | 按位取反 | int d = ~5;(结果为 -6) |
<< | 左移 | int e = 5 << 1;(结果为 10) |
>> | 带符号右移 | int f = -5 >> 1;(结果为 -3) |
>>> | 无符号右移 | int g = -5 >>> 1;(结果为 2147483646) |
注意事项:
- 左移效果:
a << n等价于a * 2^n。 - 右移效果:
a >> n等价于a / 2^n(保留符号位)。 - 无符号右移:
a >>> n总是填充 0,忽略符号位。
2.6 条件运算符(三目运算符)
根据条件返回两个值中的一个。
int result = (a > b) ? a : b; // 若 a > b,返回 a;否则返回 b
注意事项:
- 简洁性:适用于简单条件判断,避免冗长的
if-else结构。 - 类型兼容:
? :两侧的表达式类型需一致或可隐式转换。
2.7 其他运算符
(1) instanceof 运算符
检查对象是否属于某个类或接口。
if (obj instanceof String) {String str = (String) obj; // 类型转换
}
(2) 数组运算符 []
访问数组元素。
int[] arr = {1, 2, 3};
int value = arr[0]; // 访问第一个元素
(3) 括号 () 和类型转换
- 强制类型转换:
int a = (int) 3.14; - 优先级控制:
int result = (5 + 3) * 2;
3. Java运算符优先级(从高到低)
| 优先级 | 运算符类别 | 示例 |
|---|---|---|
| 1 | ()、[]、. | arr[0]、obj.method() |
| 2 | 单目运算符(++、--、!) | !a、a++ |
| 3 | 算术运算符(*、/、%) | a * b |
| 4 | 算术运算符(+、-) | a + b |
| 5 | 移位运算符(<<、>>、>>>) | a << 1 |
| 6 | 比较运算符(<、>、== 等) | a > b |
| 7 | 位运算符(&、^、|) | a & b |
| 8 | 逻辑运算符(&&、||) | a && b |
| 9 | 条件运算符(? :) | (a > b) ? a : b |
| 10 | 赋值运算符(=、+= 等) | a = 5 |
注意事项:
- 避免歧义:优先级不明确时,使用括号
()明确执行顺序(如(a + b) * c)。 - 结合性:
- 左结合性:
a + b + c等价于(a + b) + c。 - 右结合性:赋值运算符
a = b = c等价于a = (b = c)。
- 左结合性:
4. 常见问题与解决方案
Q1: 为什么 5 / 2 的结果是 2 而不是 2.5?
- 原因:
int / int的结果仍为int,小数部分被截断。 - 解决方案:强制转换为浮点类型(如
5 / 2.0或(double) 5 / 2)。
Q2: 自增运算符 ++i 和 i++ 有什么区别?
- 区别:
++i:先自增,再返回值。i++:先返回值,再自增。
- 示例:
int i = 5; System.out.println(++i); // 输出 6 System.out.println(i++); // 输出 6,然后 i 变为 7
Q3: 为什么 a & b 和 a && b 的行为不同?
- 区别:
a & b:按位与(对二进制位操作)。a && b:逻辑与(短路运算,仅在左侧为true时计算右侧)。
- 示例:
int a = 5; // 二进制 101 int b = 3; // 二进制 011 System.out.println(a & b); // 输出 1(二进制 001)
Q4: 如何避免逻辑运算符的短路行为?
- 解决方案:使用非短路运算符
&和|,确保两侧表达式均被计算。
5. 最佳实践
- 清晰优先:使用括号
()明确运算顺序,避免依赖优先级。 - 避免复杂表达式:如
a + b * c - d / e,拆分成多行提高可读性。 - 类型转换显式化:在涉及不同类型运算时,显式转换以避免意外结果。
- 位运算优化性能:在需要高效操作时(如二进制处理),使用位运算符替代算术运算。
6. 总结
| 运算符类别 | 核心用途 | 典型场景 |
|---|---|---|
| 算术运算符 | 基本数学运算 | 计算数值、自增/自减 |
| 赋值运算符 | 变量赋值 | 更新变量值 |
| 比较运算符 | 条件判断 | 控制流程(如 if、while) |
| 逻辑运算符 | 组合布尔表达式 | 复杂条件判断 |
| 位运算符 | 二进制位操作 | 高效数据处理、加密算法 |
| 条件运算符 | 简化条件赋值 | 替代简单 if-else 结构 |
