Java-基础(2)-运算符-从入门到精通的完整指南
引言:运算符的重要性
在 Java 编程的宇宙中,运算符就如同数学中的基本运算符号,是构建程序逻辑的基石。无论是简单的数值计算,还是复杂的业务逻辑处理,运算符都扮演着不可或缺的角色。据统计,在典型的 Java 代码中,平均每行会出现 1.5 个运算符,这足以证明其重要性。
本文将带你系统性地掌握 Java 运算符的各个方面,从基础概念到高级应用,从语法规则到实战技巧,助你全面提升编程能力。
1. 运算符体系概览
1.1 算术运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 算术运算符 | + | 加法 | 数值相加 | 5 + 3 | 8 |
- | 减法 | 数值相减 | 10 - 4 | 6 | |
* | 乘法 | 数值相乘 | 6 * 7 | 42 | |
/ | 除法 | 数值相除 | 15 / 4 | 3 | |
% | 取模 | 返回余数 | 15 % 4 | 3 | |
++ | 自增 | 值增加1 | int a=5; a++; | 6 | |
-- | 自减 | 值减少1 | int a=5; a--; |
|
1.2 关系运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 关系运算符 | == | 等于 | 比较是否相等 | 5 == 5 | true |
!= | 不等于 | 比较是否不等 | 5 != 3 | true | |
> | 大于 | 比较大小 | 10 > 5 | true | |
< | 小于 | 比较大小 | 3 < 2 | false | |
>= | 大于等于 | 比较大小 | 5 >= 5 | true | |
<= | 小于等于 | 比较大小 | 4 <= 5 | true |
1.3 逻辑运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 逻辑运算符 | && | 逻辑与 | 两个条件都真 | true && false | false |
|| | 逻辑或 | 任一条件为真 | true || false | true | |
! | 逻辑非 | 取反操作 | !true | false |
1.4 位运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 位运算符 | & | 按位与 | 二进制位与操作 | 5 & 3 | 1 |
| | 按位或 | 二进制位或操作 | 5 | 3 | 7 | |
^ | 按位异或 | 二进制位异或操作 | 5 ^ 3 | 6 | |
~ | 按位取反 | 二进制位取反 | ~5 | -6 | |
<< | 左移位 | 二进制左移指定位 | 5 << 1 | 10 | |
>> | 右移位 | 二进制右移指定位 | 5 >> 1 | 2 | |
>>> | 无符号右移 | 二进制无符号右移 | -5 >>> 1 | 2147483645 |
1.5 赋值运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 赋值运算符 | = | 赋值 | 基本赋值操作 | int a = 5; | a=5 |
+= | 加后赋值 | a += b 等价于 a = a + b | a=5; a+=3; | a=8 | |
-= | 减后赋值 | a -= b 等价于 a = a - b | a=5; a-=2; | a=3 | |
*= | 乘后赋值 | a *= b 等价于 a = a * b | a=5; a*=2; | a=10 | |
/= | 除后赋值 | a /= b 等价于 a = a / b | a=10; a/=2; | a=5 | |
%= | 取模后赋值 | a %= b 等价于 a = a % b | a=10; a%=3; | a=1 | |
&= | 位与后赋值 | a &= b 等价于 a = a & b | a=5; a&=3; | a=1 | |
|= | 位或后赋值 | a |= b 等价于 a = a | b | a=5; a|=3; | a=7 | |
^= | 位异或后赋值 | a ^= b 等价于 a = a ^ b | a=5; a^=3; | a=6 | |
<<= | 左移后赋值 | a <<= b 等价于 a = a << b | a=5; a<<=1; | a=10 | |
>>= | 右移后赋值 | a >>= b 等价于 a = a >> b | a=5; a>>=1; | a=2 | |
>>>= | 无符号右移后赋值 | a >>>= b 等价于 a = a >>> b | a=-5; a>>>=1; | a=2147483645 |
1.6 其他运算符
| 类别 | 运算符 | 名称 | 描述 | 示例 | 结果 |
|---|---|---|---|---|---|
| 三元运算符 | ( )? : | 条件运算符 | 条件判断赋值 | int max = (a>b) ? a : b; | 返回较大值 |
| 类型运算符 | instanceof | 实例类型检查 | 检查对象类型 | obj instanceof String | true/false |
2. 算术运算符
2.1 基本算术运算
public class ArithmeticOperations {
public static void main(String[] args) {
int a = 20;
int b = 6;
// 基本运算
System.out.println("加法: " + (a + b)); // 26
System.out.println("减法: " + (a - b)); // 14
System.out.println("乘法: " + (a * b)); // 120
System.out.println("除法: " + (a / b)); // 3
System.out.println("取模: " + (a % b)); // 2
// 浮点数运算
double x = 20.0;
double y = 6.0;
System.out.println("浮点除法: " + (x / y)); // 3.333...
}
}
2.2 自增自减运算符
public class IncrementDecrement {
public static void main(String[] args) {
int count = 5;
// 前缀形式:先运算后使用
System.out.println("前缀自增: " + (++count)); // 6
System.out.println("前缀自减: " + (--count)); // 5
// 后缀形式:先使用后运算
int result = count++;
System.out.println("后缀自增结果: " + result); // 5
System.out.println("当前值: " + count); // 6
}
}
关键区别:
前缀形式:++i 先增加后使用
后缀形式:i++ 先使用后增加
3. 关系运算符
public class RelationalOperators {
public static void main(String[] args) {
int age = 25;
int minAge = 18;
int maxAge = 60;
// 基本比较
System.out.println("是否成年: " + (age >= minAge)); // true
System.out.println("是否退休: " + (age > maxAge)); // false
System.out.println("不是18岁: " + (age != 18)); // true
// 字符串比较注意事项
String s1 = "hello";
String s2 = new String("hello");
String s3 = "hello";
System.out.println("s1 == s2: " + (s1 == s2)); // false
System.out.println("s1 == s3: " + (s1 == s3)); // true
System.out.println("s1.equals(s2): " + s1.equals(s2)); // true
}
}
关系运算符用于比较两个值,返回布尔结果。
对象比较应该使用 equals()方法,==比较的是引用地址。
4. 逻辑运算符
4.1 基本逻辑运算
public class LogicalOperators {
public static void main(String[] args) {
boolean hasAccount = true;
boolean isVerified = false;
boolean hasBalance = true;
// 与运算:所有条件都为真
boolean canWithdraw = hasAccount && isVerified && hasBalance;
System.out.println("可以取款: " + canWithdraw); // false
// 或运算:至少一个条件为真
boolean canLogin = hasAccount || isVerified;
System.out.println("可以登录: " + canLogin); // true
// 非运算:取反
boolean cannotLogin = !hasAccount;
System.out.println("不能登录: " + cannotLogin); // false
}
}
4.2 短路特性实战
public class ShortCircuitDemo {
public static void main(String[] args) {
String text = null;
// 避免空指针异常
if (text != null && text.length() > 0) {
System.out.println("文本有效");
} else {
System.out.println("文本无效或为空");
}
// 性能优化:将计算量大的操作放在后面
int[] numbers = {1, 2, 3};
if (numbers.length > 0 && calculateSum(numbers) > 5) {
System.out.println("总和大于5");
}
}
static int calculateSum(int[] arr) {
System.out.println("计算总和...");
int sum = 0;
for (int num : arr) {
sum += num;
}
return sum;
}
}
5. 位运算符
位运算符直接操作二进制位,在性能优化和系统编程中极为重要。
public class BitwiseOperations {
public static void main(String[] args) {
int a = 12; // 二进制: 1100
int b = 10; // 二进制: 1010
System.out.println("a & b: " + (a & b)); // 8 (1000)
System.out.println("a | b: " + (a | b)); // 14 (1110)
System.out.println("a ^ b: " + (a ^ b)); // 6 (0110)
System.out.println("~a: " + (~a)); // -13
// 移位运算
int num = 8; // 二进制: 1000
System.out.println("左移: " + (num << 1)); // 16
System.out.println("右移: " + (num >> 1)); // 4
System.out.println("无符号右移: " + (num >>> 1)); // 4
}
}
6. 赋值运算符
public class AssignmentOperators {
public static void main(String[] args) {
int total = 100;
// 复合赋值运算符
total += 50; // total = total + 50
total -= 20; // total = total - 20
total *= 2; // total = total * 2
total /= 4; // total = total / 4
total %= 3; // total = total % 3
System.out.println("最终结果: " + total);
// 特殊用法
StringBuilder message = new StringBuilder();
message.append("Hello").append(" ").append("World");
System.out.println(message.toString());
}
}
7. 三元运算符
public class TernaryOperator {
public static void main(String[] args) {
int score = 85;
// 基本用法
String result = (score >= 60) ? "及格" : "不及格";
System.out.println("考试结果: " + result);
// 嵌套用法(谨慎使用)
String grade = (score >= 90) ? "A" :
(score >= 80) ? "B" :
(score >= 70) ? "C" :
(score >= 60) ? "D" : "F";
System.out.println("成绩等级: " + grade);
// 返回不同类型的值
Object value = (score > 80) ? "优秀" : 0;
System.out.println("评估结果: " + value);
}
}
8. 运算符优先级
| 优先级 | 运算符 | 类别 | 描述 | 结合性 |
|---|---|---|---|---|
| 1 | () [] . | 特殊 | 括号、数组访问、成员访问 | 左→右 |
| 2 | ++ -- ! ~ +(正) -(负) (type) | 一元 | 自增自减、逻辑非、位非、类型转换 | 右→左 |
| 3 | * / % | 算术 | 乘、除、取模 | 左→右 |
| 4 | + - | 算术 | 加、减 | 左→右 |
| 5 | << >> >>> | 位运算 | 移位运算符 | 左→右 |
| 6 | < <= > >= instanceof | 关系 | 关系比较、类型检查 | 左→右 |
| 7 | == != | 关系 | 相等性比较 | 左→右 |
| 8 | & | 位运算 | 按位与 | 左→右 |
| 9 | ^ | 位运算 | 按位异或 | 左→右 |
| 10 | | | 位运算 | 按位或 | 左→右 |
| 11 | && | 逻辑 | 逻辑与 | 左→右 |
| 12 | || | 逻辑 | 逻辑或 | 左→右 |
| 13 | ?: | 三元 | 条件运算符 | 右→左 |
| 14 | = += -= *= /= %= &= ^= |= <<= >>= >>>= | 赋值 | 各种赋值运算 | 右→左 |
9. 最佳实践与常见陷阱
9.1 最佳实践
1. 使用括号明确优先级:即使知道优先级,也使用括号提高可读性
2. 利用短路特性:将计算量大的操作放在条件判断的后面
3. 避免浮点数相等比较:使用容差范围进行比较
4. 谨慎使用自增自减:避免在复杂表达式中使用
9.2 常见陷阱
public class CommonPitfalls {
public static void main(String[] args) {
// 陷阱1:整数除法
double result = 5 / 2; // 2.0, 不是2.5
double correct = 5.0 / 2; // 2.5
// 陷阱2:浮点数精度
System.out.println(0.1 + 0.2 == 0.3); // false
System.out.println(Math.abs(0.1 + 0.2 - 0.3) < 1e-10); // true
// 陷阱3:字符串比较
String s1 = "hello";
String s2 = new String("hello");
System.out.println(s1 == s2); // false
// 陷阱4:运算符优先级
int a = 5;
int b = 10;
int c = a + b * 2; // 25, 不是30
}
}
10. 总结与进阶建议
10.1 核心要点总结
1. 算术运算符:注意整数除法的截断问题
2. 关系运算符:对象比较使用 equals() 方法
3. 逻辑运算符:充分利用短路特性优化代码
4. 位运算符:掌握权限控制等实际应用场景
5. 赋值运算符:使用复合形式简化代码
6. 三元运算符:避免过度嵌套保持可读性
7. 类型检查:使用 `instanceof` 确保类型安全
8. 优先级:不确定时使用括号明确意图
结语
Java 运算符虽然基础,但却是构建复杂程序的基石。通过本文的系统学习,相信你已经对 Java 运算符有了全面而深入的理解。记住,真正的高手不是知道所有运算符,而是知道在合适的场景使用合适的运算符。
编程之路漫漫,运算符只是起点。保持学习的热情,不断实践和探索,你将成为真正的 Java 大师!
更多推荐
所有评论(0)