作为一名Java开发工程师,你一定知道,运算符(Operators) 是Java语言中最基础、最常用的语法元素之一。无论是进行变量赋值、数值计算、逻辑判断还是对象比较,都离不开运算符的支持。
本文将带你系统梳理 Java中的所有常用运算符,包括:
- 算术运算符
- 关系运算符
- 逻辑运算符
- 赋值运算符
- 位运算符
- 条件运算符(三元运算符)
- 类型相关运算符(instanceof)
并通过实际代码示例和常见误区分析,帮助你写出更安全、高效、可读性强的Java代码。
🧠 一、什么是运算符?
在Java中,运算符是对操作数(如变量、常量)进行操作的符号。例如:
int a = 5 + 3;
这里的 + 就是运算符,5 和 3 是操作数,a 是赋值目标。
➕➖➗✖️ 二、算术运算符
算术运算符用于执行基本的数学运算,是最常见的运算符之一。
| 运算符 | 含义 | 示例 |
|---|---|---|
+ | 加法 | a + b |
- | 减法 | a - b |
* | 乘法 | a * b |
/ | 除法 | a / b |
% | 取模(取余数) | a % b |
++ | 自增(前缀/后缀) | ++a 或 a++ |
-- | 自减(前缀/后缀) | --a 或 a-- |
示例
int a = 10, b = 3;
System.out.println(a + b); // 输出:13
System.out.println(a / b); // 输出:3(整数除法)
System.out.println(a % b); // 输出:1
⚠️ 注意:
- 整数相除结果仍为整数。
- 使用
double可以得到浮点结果。- 前缀自增(
++a)先加再使用,后缀自增(a++)先使用后加。
🔍 三、关系运算符(比较运算符)
关系运算符用于比较两个值之间的大小或是否相等,返回布尔类型(true 或 false)。
| 运算符 | 含义 | 示例 |
|---|---|---|
== | 等于 | a == b |
!= | 不等于 | a != b |
> | 大于 | a > b |
< | 小于 | a < b |
>= | 大于等于 | a >= b |
<= | 小于等于 | a <= b |
示例:
int x = 5, y = 10;
System.out.println(x < y); // true
System.out.println(x == y); // false
❗注意:
==比较的是基本类型的值,但对引用类型(如 String)比较的是地址而非内容。- 引用类型建议使用
.equals()方法比较内容。
🔄 四、逻辑运算符
逻辑运算符用于组合多个布尔表达式,常用于条件判断。
| 运算符 | 含义 | 示例 |
|---|---|---|
&& | 逻辑与(短路) | a && b |
| ` | ` | |
! | 逻辑非 | !a |
示例:
int age = 25;
boolean isAdult = age >= 18;
boolean hasLicense = true;
if (isAdult && hasLicense) {
System.out.println("可以开车");
}
⚠️ 短路特性:
&&:如果第一个条件为false,则不再判断后续条件。||:如果第一个条件为true,则不再判断后续条件。
💾 五、赋值运算符
赋值运算符用于给变量赋值,也可以结合其他运算符简化写法。
| 运算符 | 含义 | 示例 |
|---|---|---|
= | 赋值 | a = 5 |
+= | 加后赋值 | a += b → a = a + b |
-= | 减后赋值 | a -= b |
*= | 乘后赋值 | a *= b |
/= | 除后赋值 | a /= b |
%= | 取模后赋值 | a %= b |
示例:
int total = 100;
total -= 20; // 等价于 total = total - 20;
🔢 六、位运算符(了解即可,进阶使用)
位运算符用于对整数进行二进制位级别的操作,性能高但可读性差,通常用于底层开发、加密、压缩等领域。
| 运算符 | 含义 | 示例 |
|---|---|---|
& | 按位与 | a & b |
| ` | ` | 按位或 |
^ | 按位异或 | a ^ b |
~ | 按位取反 | ~a |
<< | 左移 | a << 2 |
>> | 右移(带符号) | a >> 2 |
>>> | 无符号右移 | a >>> 2 |
示例:
int a = 5; // 二进制:0101
int b = 3; // 二进制:0011
System.out.println(a & b); // 输出:1(0001)
System.out.println(a | b); // 输出:7(0111)
❓ 七、条件运算符(三元运算符)
三元运算符是一个简洁的条件判断表达式,适用于简单的 if-else 场景。
语法:
变量 = (条件) ? 表达式1 : 表达式2;
示例:
int score = 85;
String result = (score >= 60) ? "及格" : "不及格";
System.out.println(result); // 输出:及格
🔎 八、类型相关运算符
1. instanceof
用于判断一个对象是否属于某个类或其子类的实例。
Object obj = new String("Hello");
if (obj instanceof String) {
System.out.println("obj 是 String 类型");
}
⚠️
instanceof在向下转型前非常有用,避免 ClassCastException。
🧩 九、运算符优先级一览表(从高到低)
| 优先级 | 运算符 | 结合方向 |
|---|---|---|
| 1 | () [] . | 从左向右 |
| 2 | ++ -- ! ~ | 从右向左 |
| 3 | * / % | 从左向右 |
| 4 | + - | 从左向右 |
| 5 | << >> >>> | 从左向右 |
| 6 | < <= > >= | 从左向右 |
| 7 | == != | 从左向右 |
| 8 | & | 从左向右 |
| 9 | ^ | 从左向右 |
| 10 | ` | ` |
| 11 | && | 从左向右 |
| 12 | ` | |
| 13 | ?: | 从右向左 |
| 14 | `= += -= *= /= %= &= ^= | = <<= >>= >>>=` |
✅ 建议:使用括号
( )明确优先级,提高代码可读性。
🚫 十、常见错误与注意事项
| 错误场景 | 正确做法 |
|---|---|
误用 =(赋值)代替 ==(比较) | 使用 == 判断相等 |
字符串用 == 比较内容 | 使用 .equals() |
| 忽略逻辑运算符的短路特性 | 根据业务需求选择是否使用短路 |
浮点数比较直接使用 == | 使用精度误差判断,如 Math.abs(a - b) < 1e-6 |
| 未处理类型转换导致异常 | 使用 instanceof 验证后再转型 |
💡 十一、实际开发中的最佳实践
| 场景 | 推荐做法 |
|---|---|
| 数值比较 | 使用 ==, !=, >, < 等 |
| 字符串比较 | 使用 .equals() |
| 多条件判断 | 使用逻辑运算符组合,并考虑短路优化 |
| 赋值操作 | 使用复合赋值运算符简化代码 |
| 类型检查 | 使用 instanceof 避免运行时错误 |
| 性能敏感场景 | 使用位运算(如标志位、权限掩码) |
| 条件分支简单时 | 使用三元运算符提升简洁性 |
📚 十二、总结
| 类别 | 运算符 | 用途 |
|---|---|---|
| 算术 | + - * / % ++ -- | 数值计算 |
| 关系 | == != > < >= <= | 比较值 |
| 逻辑 | `&& | |
| 赋值 | `= += -= *= /= %= &= ^= | = <<= >>= >>>=` |
| 位 | `& | ^ ~ << >> >>>` |
| 条件 | ? : | 简洁的 if-else 替代 |
| 类型 | instanceof | 对象类型判断 |
📎 十三、附录:常用运算符速查表
| 运算符 | 类型 | 示例 | 说明 |
|---|---|---|---|
+ | 算术 | a + b | 加法 |
== | 关系 | a == b | 相等判断 |
&& | 逻辑 | a && b | 短路与 |
= | 赋值 | a = 5 | 赋值 |
?: | 条件 | a > b ? x : y | 三元运算 |
instanceof | 类型 | obj instanceof String | 类型检查 |
如果你正在准备技术分享、博客写作或者面试复习,这篇文章都可以作为一份详尽的参考资料。欢迎点赞、收藏、转发,也欢迎留言交流你遇到的运算符相关问题,我们下期再见 👋
📌 关注我,获取更多Java核心技术深度解析!