文章目录
- 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 结构 |