在 Java 开发中,三目运算符 (?:)几乎是最简洁的条件判断写法之一。
它可以用一行代码替代 if...else,让逻辑更紧凑,但使用不当会导致可读性差 甚至类型问题。
本文会带你从语法、常见误用、性能、最佳实践四个角度,彻底掌握它。
1. 基本语法
java
条件表达式 ? 表达式1 : 表达式2
执行流程:
- 判断条件表达式 结果是否为
true true→ 执行 表达式1false→ 执行 表达式2
例:
java
int a = 10, b = 20;
int max = a > b ? a : b;
2. 特点与限制
- 必须返回一个值(因为它是表达式,而非语句)
- 两个返回值类型要兼容(编译器会自动做类型提升)
- 可嵌套,但可读性会下降
3. 常见坑点
3.1 类型不兼容
java
int x = true ? 1 : 1.5; // 编译错误
原因:1 是 int,1.5 是 double,自动提升后结果为 double,不能直接赋给 int。
3.2 嵌套三目运算符可读性差
java
String result = score > 90 ? "优" : score > 60 ? "及格" : "不及格";
虽然可以写,但一旦逻辑复杂,会让人看晕。
✅ 建议用括号明确优先级:
java
String result = score > 90 ? "优" : (score > 60 ? "及格" : "不及格");
或者直接用 if...else。
3.3 空指针风险
java
String name = user != null ? user.getName() : "未知";
如果 user 为 null,没问题;但若 user.getName() 返回 null,可能仍需额外处理。
4. 最佳实践
4.1 简单赋值时用三目运算符
java
int max = a > b ? a : b;
一行解决,清晰明了。
4.2 避免复杂条件
当判断逻辑超过一层嵌套,直接用 if...else 反而更可读。
4.3 类型明确化
避免编译器自动提升带来的意外类型变化:
java
double value = condition ? 1.0 : 2.0; // 明确写成 double
4.4 配合 Objects 工具类防空
java
String name = Objects.nonNull(user) ? user.getName() : "未知";
4.5 避免副作用表达式
java
condition ? methodA() : methodB();
虽然可行,但最好不要在 ?: 两边放有副作用的代码(比如改全局变量),容易出 bug。
5. 性能表现
三目运算符本质是条件判断 + 分支跳转 ,与 if...else 性能差异极小。
选择它更多是为了代码简洁性而非性能。
6. 总结
| 场景 | 建议 |
|---|---|
| 简单赋值 | ✅ 用三目运算符 |
| 多层条件 | ❌ 用 if...else |
| 不同类型返回 | 显式类型转换 |
| 可能空指针 | 用 Objects 工具类 |
✅ 一句话记忆:
三目运算符适合"简单条件 + 单值返回",逻辑复杂时别硬写,代码可读性永远优先于一行的爽感。