Java 运算符(手把手讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观

在 Java 编程中,运算符(Operators)是构建逻辑的核心工具。它们如同程序中的“交通信号灯”,指导着代码如何处理数据、执行判断或改变变量状态。对于编程初学者而言,掌握运算符的使用规则和特性,是编写高效、可读性强的代码的重要基础。本文将系统梳理 Java 中各类运算符的功能、使用场景及常见误区,通过实例解析与形象化比喻,帮助读者快速构建对运算符的立体认知。


一、基础运算符:程序的“基本算术工具”

1.1 算术运算符(Arithmetic Operators)

Java 的算术运算符与数学中的符号高度一致,但其应用场景更为灵活。例如,+ 除了执行加法外,还能用于字符串拼接,这类似于“将两个木块拼接成更长的木板”。

常用算术运算符及示例

运算符功能示例代码输出结果
+加法或字符串拼接5 + 3"Hello" + "World"8 或 "HelloWorld"
-减法10 - 46
*乘法3 * 412
/除法10 / 33(整数除法)
%取模(求余数)10 % 31

关键点解析

  • 整数除法的陷阱:当使用 / 运算符对两个整数进行运算时,结果会自动截断小数部分(如 7 / 2 的结果为 3,而非 3.5)。若需保留小数,至少一个操作数需为浮点类型(如 7.0 / 2)。
  • 字符串拼接的扩展性:通过 + 运算符,可以轻松将多个字符串组合成新的字符串,例如:
    String greeting = "Hello" + " " + "Java" + "!";  
    System.out.println(greeting); // 输出 "Hello Java!"  
    

1.2 赋值运算符(Assignment Operators)

赋值运算符用于将值或表达式的结果赋给变量,其核心符号是 =。通过结合其他运算符(如 +=-=),可以简化代码的书写。

常见赋值运算符及优化示例

运算符等效表达式示例代码
=直接赋值int a = 5;
+=a = a + ba += 3(等价于 a = a + 3
-=a = a - ba -= 2
*=a = a * ba *= 4
/=a = a / ba /= 2
%=a = a % ba %= 3

应用场景
假设需要将一个变量 score 的值增加 10,使用 += 运算符比显式写出 score = score + 10 更简洁,且不易出错。


二、逻辑与关系运算符:程序的“决策者”

2.1 比较运算符(Relational Operators)

比较运算符用于判断两个值之间的关系(如大小、相等),返回布尔值 truefalse。这类运算符是条件语句(如 if)和循环(如 while)的核心组成部分。

比较运算符详解

运算符功能示例代码输出结果
==判断是否相等5 == 3false
!=判断是否不相等"Java" != "java"true
>判断左侧是否大于右侧10 > 5true
<判断左侧是否小于右侧3 < 2false
>=判断左侧是否大于或等于右侧7 >= 7true
<=判断左侧是否小于或等于右侧4 <= 5true

注意事项

  • 类型敏感性:若比较不同数据类型的值(如 5 == 5.0),Java 会自动进行类型转换,但结果仍为 true
  • 字符串比较的特殊性:使用 == 比较字符串时,比较的是对象的引用地址而非内容。若需比较内容,应使用 equals() 方法:
    String str1 = "Java";  
    String str2 = new String("Java");  
    System.out.println(str1 == str2); // 输出 false(引用不同)  
    System.out.println(str1.equals(str2)); // 输出 true(内容相同)  
    

2.2 逻辑运算符(Logical Operators)

逻辑运算符用于组合或反转布尔表达式的结果,常见于需要多条件判断的场景。

常用逻辑运算符及示例

运算符功能示例代码输出结果
&&逻辑与(短路)(5 > 3) && (2 < 4)true
逻辑或(短路)(10 < 5) || (8 > 6)true
!逻辑非(取反)!(3 == 5)true

短路行为的解释

  • &&|| 的特性:当左侧表达式的结果已足以确定整体结果时,右侧表达式将不再执行。例如,在 false && someMethod() 中,someMethod() 不会被调用。这种特性可避免空指针等错误:
    if (obj != null && obj.isValid()) {  
      // 安全调用 obj 的方法  
    }  
    

三、位运算符:底层操作的“精细工具”

位运算符直接操作变量的二进制位,常用于优化性能或处理底层数据。尽管对初学者可能较难理解,但掌握其基本概念对理解 Java 内部机制大有帮助。

3.1 基本位运算符及规则

二进制基础复习

每个整数在内存中以二进制形式存储,例如 5 的二进制为 1016110。位运算符的操作基于这些二进制位的每一位。

常用位运算符详解

运算符功能示例代码(以 5(0101)和 3(0011)为例)
&按位与5 & 30001(十进制 1
按位或5 | 30111(十进制 7
^按位异或5 ^ 30110(十进制 6
~按位取反~511111111111111111111111111111010(十进制 -6
<<左移5 << 11010(十进制 10
>>右移(带符号)5 >> 10010(十进制 2
>>>右移(无符号)5 >>> 1 → 同 >>,但忽略符号位

实际应用场景

  • 交换两个变量的值
    int a = 5, b = 3;  
    a = a ^ b; // a = 6(二进制 0110)  
    b = a ^ b; // b = 5(0101)  
    a = a ^ b; // a = 3(0011)  
    

    这种方法无需临时变量,但可读性较低,建议仅在性能敏感场景使用。


四、三元运算符与复合运算符:代码简洁性的“秘密武器”

4.1 三元运算符(Ternary Operator)

三元运算符 ?: 是 Java 中唯一的三目运算符,用于替代简单的 if-else 结构,使代码更紧凑。其语法为:

条件 ? 表达式1(条件为 true 时执行) : 表达式2(条件为 false 时执行)  

示例对比

// 传统 if-else 写法  
int max = 0;  
if (a > b) {  
    max = a;  
} else {  
    max = b;  
}  

// 三元运算符写法  
int max = (a > b) ? a : b;  

注意事项

  • 可读性权衡:当条件分支复杂时,三元运算符可能导致代码难以理解,此时应优先使用 if-else
  • 类型一致性:两个分支的返回值类型需兼容(如 intdouble 可隐式转换为 double)。

4.2 复合赋值与增量/减量运算符

增量/减量运算符(++ 和 --)

这两个运算符用于快速增加或减少变量值 1,分为前缀(++i)和后缀(i++)两种形式。两者的区别在于返回值:

  • 前缀形式:先自增再返回值。
  • 后缀形式:先返回原值再自增。
int i = 5;  
int a = ++i; // a = 6,i = 6  
int b = i--; // b = 6,i = 5  

复合赋值的进阶用法

结合算术运算符和赋值运算符,可以实现更复杂的逻辑。例如:

int count = 10;  
count += 5; // 等价于 count = count + 5  
count *= 2; // 等价于 count = count * 2 → 最终值为 30  

五、运算符优先级与结合性:避免歧义的“规则手册”

5.1 运算符优先级表

Java 中运算符的优先级决定了表达式中运算的执行顺序。优先级高的运算符会先于低优先级的运算符执行。

关键优先级层级示例

优先级运算符类型示例表达式
1后缀运算符i++, arr[0]
2赋值运算符a = b += 5
3一元运算符+5, !flag
4乘性运算符a * b % c
5加减运算符a + b - c
6关系运算符a > b < c
7逻辑运算符a && b || c

优先级冲突的解决
当优先级相同时,结合性规则决定运算顺序。例如,+- 的优先级相同,均为左结合性,因此 a - b + c 等价于 (a - b) + c

5.2 使用括号明确运算顺序

为避免歧义,建议在复杂表达式中使用括号显式指定优先级:

// 不使用括号可能导致意外结果  
int result = 10 + 5 * 2; // 结果为 20(先执行乘法)  
// 显式指定加法优先  
int result = (10 + 5) * 2; // 结果为 30  

六、实战案例:综合运用运算符解决实际问题

6.1 场景:成绩等级判断

假设需要根据分数 score 判断学生等级:

  • 90 ≤ score ≤ 100 → "A"
  • 80 ≤ score < 90 → "B"
  • 其他 → "C"

解决方案一:使用多重 if-else

if (score >= 90 && score <= 100) {  
    grade = "A";  
} else if (score >= 80 && score < 90) {  
    grade = "B";  
} else {  
    grade = "C";  
}  

解决方案二:三元运算符嵌套

grade = (score >= 90) ? "A" :  
        (score >= 80) ? "B" : "C";  

6.2 场景:位运算符优化

假设需要交换两个整数的值且不使用额外变量,可通过异或运算符实现:

int a = 10, b = 20;  
a ^= b; // a = 30(二进制 11110)  
b ^= a; // b = 10(001010)  
a ^= b; // a = 20(010100)  

结论

Java 运算符如同程序的“语法基石”,其灵活运用直接影响代码的简洁性、性能和可维护性。本文通过分层讲解各类运算符的功能、示例及实际场景,帮助读者构建系统的认知框架。对于初学者,建议从基础运算符入手,逐步深入逻辑与位运算;中级开发者则可关注运算符的优化技巧与潜在陷阱。记住:代码的优雅性不仅体现在功能实现,更在于运算符的合理搭配与表达式的清晰逻辑

通过持续练习与案例分析,你将逐渐掌握运算符的“隐形语言”,让 Java 程序的每一行代码都精准传达你的意图。

最新发布