Java 第三讲:运算符(Operators)
这一讲是 Java 入门阶段最核心的内容之一,几乎所有后续的判断、循环、计算都建立在运算符的基础上。建议边看边在 IDE 里敲代码验证(推荐 IntelliJ IDEA Community 或 Eclipse)。
1. 运算符分类总览(Java 共 8 大类)
| 分类 | 符号示例 | 作用简述 | 优先级层级(大致) |
|---|---|---|---|
| 算术运算符 | + – * / % ++ — | 数学计算 | 高 |
| 赋值运算符 | = += -= *= /= %= &= |= ^= <<= >>= >>>= | 给变量赋值(带计算的快捷形式) | 最低 |
| 关系/比较运算符 | > < >= <= == != | 比较大小/是否相等,返回 boolean | 中等 |
| 逻辑运算符 | && || ! ^ | 逻辑与/或/非/异或 | 中等偏低 |
| 位运算符 | & | ^ ~ << >> >>> | 二进制位操作 | 中等 |
| 移位运算符 | << >> >>> | 位左移/右移/无符号右移 | 中等 |
| 条件/三元运算符 | ? : | 简洁的 if-else | 较高 |
| instanceof | instanceof | 类型判断 | 中等 |
| 其他 | . () [] new | 点运算、括号、数组、创建对象 | 最高 |
2. 重点详解 + 代码示例(最常考/最易错部分)
2.1 算术运算符(Arithmetic Operators)
int a = 10, b = 3;
System.out.println(a + b); // 13
System.out.println(a - b); // 7
System.out.println(a * b); // 30
System.out.println(a / b); // 3 (整数除法,向下取整)
System.out.println(a % b); // 1 (余数)
double c = 10.0 / 3; // 3.3333333333333335
System.out.println(c);
// 自增/自减(最容易错!)
int x = 5;
int y = x++; // 先赋值,后自增 → y=5, x=6
int z = ++x; // 先自增,后赋值 → z=7, x=7
System.out.println("y=" + y + ", z=" + z + ", x=" + x); // y=5, z=7, x=7
经典面试题:
int i = 1;
i = i++; // i 最后是多少? → 1(先赋值1给临时变量,再i+1,但结果没接收)
2.2 关系运算符(Relational Operators)
结果永远是 boolean 类型
int age = 20;
boolean isAdult = age >= 18; // true
boolean eq = (age == 20); // true
boolean ne = (age != 21); // true
2.3 逻辑运算符(Logical Operators)——短路 vs 非短路
| 运算符 | 含义 | 是否短路 | 特点 |
|---|---|---|---|
| && | 逻辑与 | 是 | 左边false → 右边不执行 |
| & | 逻辑与 | 否 | 两边都执行(很少用) |
| || | 逻辑或 | 是 | 左边true → 右边不执行 |
| | | 逻辑或 | 否 | 两边都执行 |
| ! | 逻辑非 | – | 取反 |
| ^ | 逻辑异或 | 否 | 两边不同为true |
int score = 85;
boolean pass = score >= 60 && score <= 100; // true
// 短路特性演示(非常重要!)
int n = 0;
boolean res = (n != 0) && (10 / n > 2); // 不会除0异常,因为短路
// 如果写成 & 就会报 ArithmeticException: / by zero
2.4 三元(条件)运算符(Ternary Operator)——最优雅的 if-else 替代
语法:条件 ? 表达式1 : 表达式2
int a = 10, b = 20;
int max = (a > b) ? a : b; // 20
String level = (score >= 90) ? "优秀"
: (score >= 80) ? "良好"
: (score >= 60) ? "及格" : "不及格";
// 经典用法:避免空指针
String name = user != null ? user.getName() : "匿名";
2.5 赋值运算符(Assignment Operators)——复合赋值
int x = 10;
x += 5; // x = x + 5 → 15
x *= 2; // x = x * 2 → 30
x >>= 2; // x = x >> 2(右移2位)
2.6 位运算符 & 移位(面试高频)
int a = 0b1010; // 10
int b = 0b1100; // 12
System.out.println(a & b); // 8 → 1000
System.out.println(a | b); // 14 → 1110
System.out.println(a ^ b); // 6 → 0110 (异或:不同为1)
System.out.println(~a); // -11 (按位取反,注意符号位)
// 移位(效率极高,常用于性能优化)
System.out.println(8 << 2); // 32 → 8 * 4
System.out.println(32 >> 3); // 4 → 32 / 8
System.out.println(-8 >>> 2); // 大正数(无符号右移,补0)
经典技巧:
- 判断奇偶:
n & 1 == 1→ 奇数 - 2的幂次快速乘除:
x << 3= x * 8 - 交换两数(不使用临时变量):
a ^= b; b ^= a; a ^= b;
3. 运算符优先级表(必须烂熟于心,括号最高)
从高到低(同一行优先级相同,从左→右结合,除赋值类从右→左):
- () . [] ++ — ! ~ (一元)
- * / %
- + –
- << >> >>>
- < <= > >= instanceof
- == !=
- &(位与)
- ^(位异或)
- |(位或)
- &&
- ||
- ? :(三元)
- = += -= *= /= %= &= |= ^= <<= >>= >>>=(赋值,从右向左)
口诀记忆:
单目算术移,乘除加减比,位与异或或,逻辑三元赋
4. 常见坑 & 面试题速览
i = i++结果是多少?(仍为原值)String s = 5 + 5 + "5"输出什么?(”105″)short s = 1; s = s + 1;编译报错吗?(报错,需强制转换)char c = 'A' + 1;结果是多少?(’B’)boolean b = true ^ true;结果?(false)
5. 练习建议(今天必须写完)
- 用三元运算符判断闰年(能被4整除但不能被100整除,或能被400整除)
- 用位运算实现:判断一个数是否是 2 的整数次幂
- 写出下面表达式的值:
int x = 3, y = 4, z = 5;
boolean res = x++ > 3 && ++y > 4 || z-- < 5;
System.out.println(x + "," + y + "," + z + "," + res);
有哪道题不会?或者想重点看哪类运算符的更多例子(位运算/三元/短路)?直接说,我继续给你展开!