Java 选择结构深度解析
一、if 结构体系
1. 单条件判断
// 基础if结构
int score = 85;
if (score >= 60) {
System.out.println("考试通过");
}
// 判断空值(防御性编程)
String text = null;
if (text != null && !text.isEmpty()) {
System.out.println(text.length());
}
执行流程:
二、if-else 分支结构
1. 双分支判断
// 温度控制系统
double temperature = 28.5;
if (temperature > 30) {
System.out.println("开启空调");
} else {
System.out.println("关闭空调");
}
// 字符串非空判断
String input = "";
if (input.isEmpty()) {
System.out.println("输入不能为空");
} else {
System.out.println("输入有效");
}
2. 多条件链式判断
// 成绩评级系统
int grade = 78;
if (grade >= 90) {
System.out.println("A");
} else if (grade >= 80) {
System.out.println("B");
} else if (grade >= 70) {
System.out.println("C");
} else {
System.out.println("D");
}
企业级规范建议:
• 当条件超过3层时,优先考虑 switch 或策略模式
• 使用卫语句减少嵌套深度
三、switch 多路分支
1. 传统语法(JDK5+)
// 星期判断系统
int day = 3;
switch (day) {
case 1:
System.out.println("星期一");
break;
case 2:
System.out.println("星期二");
break;
case 3:
System.out.println("星期三");
break;
default:
System.out.println("无效日期");
}
// 穿透特性案例(谨慎使用)
char grade = 'B';
switch (grade) {
case 'A':
case 'B':
System.out.println("优秀");
break;
case 'C':
System.out.println("合格");
break;
default:
System.out.println("需努力");
}
常见陷阱:
// 缺少break导致穿透
int num = 2;
switch (num) {
case 1:
System.out.println("一");
case 2:
System.out.println("二"); // 会继续执行后续case
case 3:
System.out.println("三");
}
// 输出:二 三
2. 增强型语法(JDK12+)
// 箭头语法(自动阻断穿透)
String season = switch (month) {
case 12, 1, 2 -> "冬季";
case 3, 4, 5 -> "春季";
case 6, 7, 8 -> "夏季";
case 9, 10, 11 -> "秋季";
default -> "无效月份";
};
// 带返回值的switch表达式
int days = switch (month) {
case 1, 3, 5, 7, 8, 10, 12 -> 31;
case 4, 6, 9, 11 -> 30;
case 2 -> {
if (isLeapYear) yield 29;
else yield 28;
}
default -> throw new IllegalArgumentException();
};
版本对比:
特性 | 传统switch | 增强型switch |
---|---|---|
返回值 | 不支持 | 支持 |
语法简洁性 | 低 | 高 |
穿透控制 | 需手动break | 自动阻断 |
多值匹配 | case堆叠 | 逗号分隔 |
四、特殊场景处理
1. 浮点数比较
// 错误方式
double a = 0.1 + 0.2;
if (a == 0.3) {
System.out.println("相等"); // 不会执行
}
// 正确方式
if (Math.abs(a - 0.3) < 1e-6) {
System.out.println("有效相等");
}
2. 对象比较
// 字符串比较陷阱
String s1 = "hello";
String s2 = new String("hello");
if (s1 == s2) { // false
System.out.println("相同对象");
}
if (s1.equals(s2)) { // true
System.out.println("内容相同");
}
五、企业级最佳实践
1. 代码规范建议
// 卫语句示例
public void processOrder(Order order) {
if (order == null) return;
if (order.isCanceled()) return;
// 核心业务逻辑
}
// 圈复杂度控制
if (conditionCount > 3) {
// 改用策略模式或状态模式
}
2. 性能优化指南
场景 | 推荐方案 | 时间复杂度 |
---|---|---|
离散值(<5个) | if-else链 | O(n) |
连续整型值(>3个) | switch | O(1) |
动态条件判断 | 哈希表查询 | O(1) |
通过深入理解选择结构的特性和应用场景,结合现代Java语法,可以编写出既高效又易维护的条件逻辑代码。建议在开发中:
- 优先使用增强型switch语法
- 复杂条件判断引入设计模式
- 定期使用代码质量分析工具检查条件复杂度