MST

星途 面试题库

面试题:Java控制流语句性能优化相关

假设在一个循环中频繁使用if - else语句来判断不同条件执行不同逻辑,从性能角度考虑,怎样优化这段代码?如果涉及到多个条件嵌套判断,有什么更好的替代方案,例如使用策略模式如何实现优化,请简述思路和关键代码实现。
36.3万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

优化if - else语句从性能角度的方法

  1. 使用switch - case代替简单if - else
    • 原理:对于基于整数或枚举类型的条件判断,switch - case在大多数编译器中会使用跳转表(jump table)实现,其时间复杂度为O(1),而if - else链的时间复杂度在最坏情况下为O(n)。
    • 示例
int num = 2;
switch (num) {
    case 1:
        // 执行逻辑1
        break;
    case 2:
        // 执行逻辑2
        break;
    default:
        // 执行默认逻辑
        break;
}
  1. 提前返回或合并条件
    • 提前返回:将最常出现的条件放在最前面,提前处理并返回,减少不必要的条件判断。
    • 合并条件:如果某些条件可以合并,将其合并为一个条件,减少判断次数。例如:
if (a > 10 && b < 20) {
    // 执行逻辑
}
  1. 使用查找表(Lookup Table)
    • 原理:适用于条件和结果存在对应关系的情况。通过数组或哈希表,以条件为索引直接获取结果,避免条件判断。
    • 示例(Java使用数组作为查找表)
int[] results = {0, 1, 2, 3}; // 假设条件0 - 3对应不同结果
int condition = 2;
int result = results[condition];

多个条件嵌套判断的替代方案 - 策略模式

  1. 思路
    • 定义策略接口:定义一个接口,该接口包含要执行的方法,不同的具体策略实现这个接口。
    • 创建具体策略类:针对每个不同的条件逻辑,创建具体的策略类,实现策略接口中的方法。
    • 使用上下文类:创建一个上下文类,该类持有一个策略接口的引用,并在其方法中调用策略接口的方法。在运行时,根据不同条件设置不同的具体策略对象给上下文类。
  2. 关键代码实现(以Java为例)
    • 策略接口
public interface Strategy {
    void execute();
}
  • 具体策略类1
public class ConcreteStrategy1 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略1的逻辑");
    }
}
  • 具体策略类2
public class ConcreteStrategy2 implements Strategy {
    @Override
    public void execute() {
        System.out.println("执行策略2的逻辑");
    }
}
  • 上下文类
public class Context {
    private Strategy strategy;
    public Context(Strategy strategy) {
        this.strategy = strategy;
    }
    public void executeStrategy() {
        strategy.execute();
    }
}
  • 使用示例
public class Main {
    public static void main(String[] args) {
        boolean condition = true;
        Strategy strategy;
        if (condition) {
            strategy = new ConcreteStrategy1();
        } else {
            strategy = new ConcreteStrategy2();
        }
        Context context = new Context(strategy);
        context.executeStrategy();
    }
}