【码道】系列博客致力于为广大Java学习者提供清晰、系统的学习路径。从基础语法到高级特性,从理论讲解到实战应用,我们将用简洁易懂的语言,带您循序渐进地掌握Java编程精髓。无论您是初学者还是希望巩固基础的开发者,都能在这里找到成长为Java高手的捷径。让我们一起探索编程之道,体验Java的无限魅力!
一、运算符:程序的"计算工具"
在上一篇文章中,我们学习了如何使用变量存储数据。而运算符则是对这些数据进行操作的工具。就像在数学中,我们使用加减乘除符号进行计算,在Java中,运算符允许我们对数据执行各种操作。
运算符是Java语言的基础元素,掌握它们的使用是编写有效程序的关键。Java提供了丰富的运算符集,我们将它们分为几大类来详细介绍。
二、算术运算符:数学计算的基础
算术运算符用于执行基本的数学运算,是最常用的运算符之一。
基本算术运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| + | 加法 | a + b |
| - | 减法 | a - b |
| * | 乘法 | a * b |
| / | 除法 | a / b |
| % | 取余(求模) | a % b |
int a = 10;
int b = 3;
System.out.println("a + b = " + (a + b)); // 输出: a + b = 13
System.out.println("a - b = " + (a - b)); // 输出: a - b = 7
System.out.println("a * b = " + (a * b)); // 输出: a * b = 30
System.out.println("a / b = " + (a / b)); // 输出: a / b = 3 (整数除法,舍弃小数部分)
System.out.println("a % b = " + (a % b)); // 输出: a % b = 1 (10除以3余1)
特别注意:
- 整数相除得到整数,小数部分会被舍弃(不是四舍五入)
- 如果想得到浮点结果,至少有一个操作数必须是浮点型
System.out.println(10 / 3); // 输出: 3
System.out.println(10.0 / 3); // 输出: 3.3333333333333335
自增和自减运算符
| 运算符 | 描述 | 示例 |
|---|---|---|
| ++ | 自增(加1) | ++a 或 a++ |
| – | 自减(减1) | –a 或 a– |
这些运算符有两种使用形式:
- 前缀形式(++a, --a):先增减,再使用
- 后缀形式(a++, a–):先使用,再增减
int x = 5;
System.out.println(++x); // 输出: 6 (先加1,再输出)
System.out.println(x); // 输出: 6
int y = 5;
System.out.println(y++); // 输出: 5 (先输出,再加1)
System.out.println(y); // 输出: 6
字符串连接符
"+"运算符在处理字符串时变为连接符:
String firstName = "张";
String lastName = "三";
String fullName = firstName + lastName; // "张三"
int age = 25;
String message = "年龄: " + age; // "年龄: 25"
三、关系运算符:比较的艺术
关系运算符用于比较两个值,结果总是布尔值(true或false)。
| 运算符 | 描述 | 示例 |
|---|---|---|
| == | 等于 | a == b |
| != | 不等于 | a != b |
| > | 大于 | a > b |
| < | 小于 | a < b |
| >= | 大于等于 | a >= b |
| <= | 小于等于 | a <= b |
int a = 10;
int b = 20;
System.out.println("a == b: " + (a == b)); // false
System.out.println("a != b: " + (a != b)); // true
System.out.println("a > b: " + (a > b)); // false
System.out.println("a < b: " + (a < b)); // true
System.out.println("a >= b: " + (a >= b)); // false
System.out.println("a <= b: " + (a <= b)); // true
特别注意:
- 对于引用类型(如String),"=="比较的是引用(地址),而不是内容
- 要比较引用类型的内容,应使用equals()方法
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true (字符串常量池中的同一引用)
System.out.println(s1 == s3); // false (不同引用)
System.out.println(s1.equals(s3)); // true (内容相同)
四、逻辑运算符:多条件判断
逻辑运算符用于组合多个条件,通常与关系运算符一起使用。
| 运算符 | 描述 | 示例 |
|---|---|---|
| && | 逻辑与(AND):两个条件都为true,结果才为true | a && b |
| || | 逻辑或(OR):两个条件有一个为true,结果就为true | a || b |
| ! | 逻辑非(NOT):条件为true,结果为false;条件为false,结果为true | !a |
int age = 25;
boolean hasIDCard = true;
// 检查是否可以进入酒吧(年龄大于18并且有身份证)
boolean canEnterBar = age >= 18 && hasIDCard;
System.out.println("可以进入酒吧: " + canEnterBar); // true
// 检查是否符合优惠条件(年龄小于12或大于60)
boolean getsDiscount = age < 12 || age > 60;
System.out.println("可以享受优惠: " + getsDiscount); // false
// 逻辑非
boolean isAdult = age >= 18;
boolean isMinor = !isAdult;
System.out.println("是未成年人: " + isMinor); // false
短路求值
逻辑运算符具有"短路"特性:
&&: 如果第一个条件为false,不再评估第二个条件||: 如果第一个条件为true,不再评估第二个条件
int x = 10;
int y = 0;
// 短路与:避免了除零错误
if (y != 0 && x / y > 5) {
System.out.println("x/y大于5");
}
// 短路或:第一个条件为true,不再评估第二个条件
if (x > 5 || x / y > 0) {
System.out.println("条件成立"); // 会输出,且不会产生除零错误
}
五、位运算符:二进制级别操作
位运算符对整数的二进制位进行操作。虽然初学者使用不多,但在特定场景下非常有用。
| 运算符 | 描述 | 示例 |
|---|---|---|
| & | 按位与(两位都为1,结果才为1) | a & b |
| | | 按位或(两位有一个为1,结果就为1) | a | b |
| ^ | 按位异或(两位不同,结果为1) | a ^ b |
| ~ | 按位取反(0变1,1变0) | ~a |
| << | 左移(每左移一位,相当于乘以2) | a << n |
| >> | 右移(每右移一位,相当于除以2) | a >> n |
| >>> | 无符号右移 | a >>> n |
int a = 5; // 二进制: 00000101
int b = 3; // 二进制: 00000011
System.out.println("a & b = " + (a & b)); // 输出: 1 (二进制: 00000001)
System.out.println("a | b = " + (a | b)); // 输出: 7 (二进制: 00000111)
System.out.println("a ^ b = " + (a ^ b)); // 输出: 6 (二进制: 00000110)
System.out.println("~a = " + (~a)); // 输出: -6 (二进制补码表示)
System.out.println("a << 2 = " + (a << 2)); // 输出: 20 (二进制: 00010100)
System.out.println("a >> 1 = " + (a >> 1)); // 输出: 2 (二进制: 00000010)
六、赋值运算符:简化赋值操作
赋值运算符用于给变量赋值,提供了更简洁的语法。
| 运算符 | 描述 | 示例 | 等价于 |
|---|---|---|---|
| = | 简单赋值 | a = b | a = b |
| += | 加法赋值 | a += b | a = a + b |
| -= | 减法赋值 | a -= b | a = a - b |
| *= | 乘法赋值 | a *= b | a = a * b |
| /= | 除法赋值 | a /= b | a = a / b |
| %= | 取余赋值 | a %= b | a = a % b |
| &= | 按位与赋值 | a &= b | a = a & b |
| |= | 按位或赋值 | a |= b | a = a | b |
| ^= | 按位异或赋值 | a ^= b | a = a ^ b |
| <<= | 左移赋值 | a <<= n | a = a << n |
| >>= | 右移赋值 | a >>= n | a = a >> n |
int a = 10;
a += 5; // 等价于 a = a + 5
System.out.println("a = " + a); // 输出: 15
a -= 3; // 等价于 a = a - 3
System.out.println("a = " + a); // 输出: 12
a *= 2; // 等价于 a = a * 2
System.out.println("a = " + a); // 输出: 24
a /= 4; // 等价于 a = a / 4
System.out.println("a = " + a); // 输出: 6
七、三元运算符:简洁的条件判断
三元运算符是Java中唯一一个需要三个操作数的运算符,常用于简单的条件赋值。
语法:条件表达式 ? 表达式1 : 表达式2
如果条件表达式结果为true,整个表达式的值为表达式1;否则为表达式2。
int age = 20;
String status = (age >= 18) ? "成年" : "未成年";
System.out.println(status); // 输出: 成年
// 等价的if-else语句
String status2;
if (age >= 18) {
status2 = "成年";
} else {
status2 = "未成年";
}
三元运算符可以嵌套使用,但容易降低代码可读性:
int score = 85;
String grade = (score >= 90) ? "优秀" : (score >= 80) ? "良好" : (score >= 60) ? "及格" : "不及格";
System.out.println("成绩等级: " + grade); // 输出: 成绩等级: 良好
八、instanceof运算符:类型检查
instanceof运算符用于检查对象是否是特定类的实例,返回布尔值。
String text = "Hello";
System.out.println(text instanceof String); // 输出: true
System.out.println(text instanceof Object); // 输出: true (String是Object的子类)
Integer num = 100;
System.out.println(num instanceof Integer); // 输出: true
System.out.println(num instanceof String); // 编译错误:不兼容的类型
九、运算符优先级
Java运算符有不同的优先级,决定了复杂表达式中操作的执行顺序。下面是主要运算符的优先级,从高到低:
- 一元运算符:++, --, !, ~
- 乘法运算符:*, /, %
- 加法运算符:+, -
- 移位运算符:<<, >>, >>>
- 关系运算符:<, >, <=, >=, instanceof
- 相等运算符:==, !=
- 位运算符:&, ^, |
- 逻辑运算符:&&, ||
- 三元运算符:? :
- 赋值运算符:=, +=, -=, 等
使用建议:尽管有优先级规则,为了提高代码可读性,建议使用括号明确表达计算顺序。
int result = 2 + 3 * 4; // 结果: 14 (乘法优先级高于加法)
int resultWithParens = (2 + 3) * 4; // 结果: 20 (括号改变计算顺序)
十、实际示例:使用运算符解决实际问题
让我们通过一个简单的购物计算程序,综合运用各种运算符:
public class ShoppingCalculator {
public static void main(String[] args) {
// 商品价格
double price1 = 99.8;
double price2 = 25.5;
double price3 = 50.0;
// 商品数量
int quantity1 = 2;
int quantity2 = 1;
int quantity3 = 3;
// 计算总价
double totalPrice = price1 * quantity1 + price2 * quantity2 + price3 * quantity3;
// 计算折扣(满300减50)
boolean isEligibleForDiscount = totalPrice >= 300;
double discount = isEligibleForDiscount ? 50 : 0;
// 最终支付金额
double finalAmount = totalPrice - discount;
// 输出结果
System.out.println("商品总价: " + totalPrice + "元");
System.out.println("是否满足折扣条件: " + (isEligibleForDiscount ? "是" : "否"));
System.out.println("折扣金额: " + discount + "元");
System.out.println("最终支付: " + finalAmount + "元");
// 计算找零(假设顾客支付了400元)
double payment = 400;
double change = payment - finalAmount;
System.out.println("支付金额: " + payment + "元");
System.out.println("找零: " + change + "元");
// 判断是否为VIP客户(使用逻辑运算符示例)
boolean isFrequentBuyer = true;
boolean hasMembership = false;
boolean isVIP = isFrequentBuyer && hasMembership;
// 使用位运算符统计购买了几种商品
int itemTypes = (quantity1 > 0 ? 1 : 0) + (quantity2 > 0 ? 1 : 0) + (quantity3 > 0 ? 1 : 0);
System.out.println("购买了" + itemTypes + "种商品");
}
}
输出结果:
商品总价: 375.1元
是否满足折扣条件: 是
折扣金额: 50.0元
最终支付: 325.1元
支付金额: 400.0元
找零: 74.9元
购买了3种商品
十一、总结与使用技巧
-
选择正确的运算符
- 进行数学计算时,注意整数除法会截断小数部分
- 比较字符串等引用类型时,使用equals()方法而非==
- 需要短路评估时,使用&&和||而非&和|
-
提高代码可读性
- 使用括号明确计算顺序,不要过分依赖运算符优先级
- 复杂的条件判断可以分解为多个简单的布尔变量
- 适当使用赋值运算符简化代码
-
避免常见错误
- 注意++/–前缀和后缀形式的区别
- 防止整数溢出(超出范围)
- 避免除零错误
- 特别注意浮点数计算中的精度问题
运算符是Java编程的重要工具,灵活运用各种运算符可以让代码更简洁高效。在实际编程中,掌握运算符的正确用法及其优先级规则,将帮助你写出更准确、更易读的代码。

741

被折叠的 条评论
为什么被折叠?



