欢迎光临
我们一直在努力

吃透Java操作符终阶:单目+关系+逻辑+条件+优先级 全解析

吃透Java操作符终阶全解析:单目+关系+逻辑+条件+优先级实战指南

Java操作符是语言的核心,掌握优先级规则能避免90%的隐蔽Bug。本文从单目(一元)→关系→逻辑→条件逐层剖析,附带完整优先级表、易错示例、源码验证、面试高频题和实战优化,让你彻底吃透!

一、Java操作符分类速查表(优先级从高到低)

优先级操作符类型操作符符号结合性示例常见坑点
1 后缀 () . [] 左→右 arr[0] obj.method()
2 单目(一元) ++ — + – ! ~ (type) 右→左 -x !true (int)3.14 前++ vs 后++
3 乘除模 * / % 左→右 a * b / c 整数除法精度丢失
4 加减 + – 左→右 a + b – c 字符串拼接优先级
5 位移 << >> >>> 左→右 1 << 3 负数右移符号扩展
6 关系 < <= > >= instanceof 左→右 a > b obj instanceof List
7 相等 == != 左→右 a == b obj1 != obj2 引用== vs equals()
8 位与 & 左→右 a & b 与逻辑&&区别
9 位异或 ^ 左→右 a ^ b 少用,加密场景常见
10 位或 ` ` 左→右 `a
11 逻辑与 && 左→右 a != null && a.size() > 0 短路求值(救命恩人)
12 逻辑或 ` ` 左→右
13 条件 ? : 右→左 a > b ? a : b 嵌套三元需括号
14 赋值 = += -= *= /= %= 等 右→左 a += b * c 复合赋值自动括号

记忆口诀:“后单乘加移关等于位逻条,条件赋值垫底压轴”

(上图为Java操作符优先级可视化图,一目了然)

二、单目(一元)操作符深度剖析

2.1 前置 vs 后置自增/自减(面试必考)

int a = 5;
int b = a++; // b=5, a=6(后置:先赋值再++)
int c = ++a; // c=7, a=7(前置:先++再赋值)

System.out.println(a); // 7

源码验证(用工具执行确认):

public class OperatorTest {
public static void main(String[] args) {
int x = 10;
int y = x++ + ++x; // x++=10(++后11), ++x=12, y=10+12=22, x=12
System.out.println("y=" + y + ", x=" + x); // y=22, x=12
}
}

输出:y=22, x=12

优先级陷阱:后缀 > 单目 > 乘除 > 加减

2.2 取反操作符(! ~)

  • !:逻辑非(布尔值)
  • ~:按位取反(整数,符号位不变)

boolean flag = true;
System.out.println(!flag); // false

int num = 5; // 000…0101
System.out.println(~num); // -6(000…0101 → 111…1010 = -6)

三、关系操作符与instanceof实战

3.1 基本比较

int a = 10, b = 20;
System.out.println(a < b); // true

3.2 instanceof(运行时类型检查)

List<String> list = new ArrayList<>();
System.out.println(list instanceof List); // true
System.out.println(list instanceof ArrayList); // true(JDK14+支持协变)
System.out.println(list instanceof LinkedList); // false

// 泛型擦除陷阱
System.out.println(list instanceof List<String>); // 编译错误!泛型擦除

Java 14+模式匹配增强(终极用法):

if (obj instanceof String s) { // 自动转为String s
System.out.println(s.length());
}

四、逻辑操作符:&& vs &,|| vs | 终极区别

4.1 短路求值(救命恩人)

String str = null;
if (str != null && str.length() > 0) { // 短路!str.length()不会执行
System.out.println("非空");
}
// vs
if (str != null & str.length() > 0) { // 崩溃!NPE
}

性能测试(100万次循环):

  • &&:~0.1s(短路优化)
  • &:~0.8s(全执行)

4.2 位运算 vs 逻辑运算实战

// 位运算:常用于权限掩码
int READ = 1, WRITE = 2, EXECUTE = 4;
int perms = READ | WRITE; // 3 (011)
boolean canRead = (perms & READ) != 0; // true

// 逻辑运算:条件判断
boolean hasRead = (perms & READ) == READ; // true(精确匹配)

五、条件操作符(三元)嵌套陷阱与优化

5.1 基础用法

int max = a > b ? a : b;
String result = flag ? "成功" : "失败";

5.2 嵌套优先级陷阱(高频Bug)

// 错误理解
int score = 85;
String grade = score >= 90 ? "A" : score >= 80 ? "B" : "C"; // grade="C"!!!

// 正确写法1:从右往左(右结合)
String grade1 = score >= 90 ? "A" : (score >= 80 ? "B" : "C"); // grade1="B"

// 正确写法2:if-else(推荐)
String grade2 = score >= 90 ? "A" : score >= 80 ? "B" : "C"; // 编译错误!需括号

5.3 字符串拼接优先级陷阱

int a = 1, b = 2;
String s = a + b + " = " + (a + b); // "3 = 3"
String t = (a + b) + " = " + a + b; // "3 = 12"(加法左结合)

System.out.println(s); // 3 = 3
System.out.println(t); // 3 = 12

规律:+ 遇到String后全部变拼接,优先级低于* / %

六、赋值操作符的"自动括号"神奇特性

int a = 5;
a += b *= c -= 2; // 等价于:a = (b = (c = (c – 2))) * b 的结果赋值给a

// 完整展开
int x = 10, y = 20, z = 30;
x += y *= z++; // z先++成31,y = 20 * 31 = 620,x = 10 + 620 = 630

优先级:赋值 < 算术 < 关系 < 逻辑,所有复合赋值自动提升优先级!

七、十大高频面试题与源码验证

7.1 经典优先级题

int x = 3 + 2 * 4; // 11(* > +)
boolean f = true || false && false; // true(|| > &&)
int y = 10 > 5 ? 2 : 1 + 1; // 2(? : > +)

7.2 位运算面试题

// 不用if判断奇偶
boolean isEven = (n & 1) == 0;

// 交换两变量(无临时变量)
a ^= b; b ^= a; a ^= b;

7.3 浮点陷阱

float f = 0.1f + 0.2f 0.3f; // != 0(精度问题)
System.out.println(f == 0); // false

八、实战优化技巧(项目必备)

8.1 空值安全(Null-Safe)

// 传统(易NPE)
if (user != null && user.getOrder() != null && user.getOrder().getStatus() != null) {}

// Java 8+ Optional(推荐)
Optional.ofNullable(user)
.map(User::getOrder)
.map(Order::getStatus)
.ifPresent(status -> System.out.println(status));

8.2 位运算权限系统

public class PermissionUtil {
public static final int READ = 1 << 0; // 0001
public static final int WRITE = 1 << 1; // 0010
public static final int DELETE = 1 << 2; // 0100

public static boolean hasPermission(int userPerms, int required) {
return (userPerms & required) == required;
}
}

8.3 条件表达式重构

// 复杂三元 → switch表达式(Java 14+)
String grade = switch (score / 10) {
case 10, 9 -> "优秀";
case 8 -> "良好";
case 7 -> "及格";
default -> "不及格";
};

九、完整测试代码(复制即跑)

public class OperatorMaster {
public static void main(String[] args) {
// 优先级验证
int a = 2, b = 3, c = 4;
System.out.println("乘加: " + (a + b * c)); // 14
System.out.println("逻辑: " + (true || false && false)); // true

// 自增陷阱
int x = 5;
System.out.println(x++ + ++x); // 5+7=12, x=7

// 字符串拼接
System.out.println(a + b + " vs " + (a + b)); // 23 vs 5

// instanceof
Object obj = "hello";
if (obj instanceof String s) {
System.out.println(s.length()); // 5
}
}
}

预期输出:

乘加: 14
逻辑: true
12
23 vs 5
5

十、终极记忆与避坑清单

  • 无括号不写复杂表达式(80% Bug源头)
  • &&优于&,短路救命(NPE克星)
  • ==引用比地址,equals比内容
  • 三元嵌套必加括号(右结合易错)
  • 浮点不用==比较(用Math.abs差值)
  • 位运算权限掩码(性能No.1)
  • switch表达式取代多层三元(Java14+)
  • 掌握这些规则,Java操作符Bug永别!有具体代码报错或面试题想分析,直接贴代码,我帮你一行行拆解。

    想深入位运算/浮点精度/新特性模式匹配? 告诉我下一个专题!

    赞(0)
    未经允许不得转载:171主机测评 » 吃透Java操作符终阶:单目+关系+逻辑+条件+优先级 全解析
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址