if语句的效率问题

if语句本身没有什么好讲的,无非就三种形态:
1、

if(条件){
            
}

2、

if(条件){
            
}else{

}

3、

if(条件){
            
}else if(条件){

}else{

}

值得探讨的是if语句的效率问题,在代码量小的时候,这个问题可以忽略,但是在代码量大的时候,这个问题就值得深究了,提高if语句效率要注意以下几点:

  • &&:第一个条件为true,才算第二个
  • ||:第一个为false,才算第二个
  • if(条件),while(条件):如果&&,尽量把可能是假的条件写到第一个去,||条件尽量把可能为true的条件写到第一个
  • 尽量不使用独立的if语句,尽量使用if else或if else if

案例一

输入一个分数,要求分数在0-100之间,判断成绩是否及格

写法1:

        Scanner in = new Scanner(System.in);
        int score; // 分数

        // 输入
        System.out.println("输入一个分数:");
        score = in.nextInt();

        // 合法性判断
        if (score > 100 || score < 0) {// 大于100的情况多些
            System.out.println("分数非法!");
        } else {
            if (score >= 60) {
                System.out.println("及格!");
            } else {
                System.out.println("再努力!");
            }
        }

在写法1中,if语句的条件放的位置是由讲究的,score > 100 放在score < 0前面是因为输入数字的时候大于100的情况更多,在||的情况下,第一个条件对了,就不会去算第二个,因此会减少计算量,从而提高if语句的效率。

写法2:

        if (score <= 100 && score >= 0) {
            if (score >= 60) {
                System.out.println("及格!");
            } else {
                System.out.println("再努力!");
            }
        } else {
            System.out.println("分数非法!");
        }

在写法2中,score <= 100放在score >= 0前面,是因为输入数字的时候小于100的情况更少,毕竟 score >= 0的情况更加多,如果score <= 100不满足,立马就走else语句体,而不会是先满足 score >= 0再不满足score <= 100才走else语句体。

写法3:

        if (score <= 100 && score >= 0) {
            if (score >= 60) {
                System.out.println("及格!");
            } else {
                System.out.println("再努力!");
            }
        }

        if (score > 100 || score < 0) {
            System.out.println("分数非法!");
        }

说实话,写法3是最愚蠢的方法,本意上与写法2无异,但这里是两个独立的if语句,至少要判断两次,绝对的影响效率

案例二

输入三个整数,按从小到大的顺序输出

写法1:

        Scanner in = new Scanner(System.in);
        int a, b, c;

        System.out.println("输入三个整数:");
        a = in.nextInt();
        b = in.nextInt();
        c = in.nextInt();

        if (a >= b && b >= c) {

        }
        if (a >= c && c >= b) {

        }
        if (b >= a && a >= c) {

        }
        if (b >= c && c >= a) {

        }
        if (c >= a && a >= b) {

        }
        if (c >= b && b >= a) {

        }

说实话,这是最蠢的写法,同理,因为这个6个独立的if语句,所以最少要判断6次

写法2:

        if (a >= b && b >= c) {

        } else if (a >= c && c >= b) {

        } else if (b >= a && a >= c) {

        } else if (b >= c && c >= a) {

        } else if (c >= a && a >= b) {

        } else {

        }

这种if else if的写法是提高效率的最好的方法,这种写法,判断最少1次,最多5次,平均3次,省事,多好。

案例三

输入一个整数,判断该整数是否能被3、5、7整除的情况

最佳写法:

        Scanner in = new Scanner(System.in);

        int num;

        System.out.println("输入一个整数:");
        num = in.nextInt();

        // 判断顺序:从3-2-1-0:从严格到宽松
        // 多条件尽可能从大到小
        if (num % 7 == 0 && num % 5 == 0 && num % 3 == 0) {

        } else if (num % 7 == 0 && num % 5 == 0) {

        } else if (num % 5 == 0 && num % 3 == 0) {

        } else if (num % 7 == 0 && num % 3 == 0) {

        } else if (num % 3 == 0) {// 一个整除,最好是从小到大

        } else if (num % 5 == 0) {

        } else if (num % 7 == 0) {

        } else {

        }

这个案例最容易出错的地方是不注意条件的判断顺序,判断顺序为什么是从3-2-1-0这样子排列,因为例如反过来的话,满足了一个num % 3 == 0,程序就不会往下走了直接输出结果,但事实上还可能还存在着num % 7 == 0 && num % 3 == 0或者num % 5 == 0 && num % 3 == 0或者num % 7 == 0 && num % 5 == 0 && num % 3 == 0这三种情况,所以是考虑不周全,无关效率。

关乎效率问题的在3个条件或者2个条件中,为什么是数字大的放在前面,例如,为什么是num % 7 == 0 && num % 5 == 0 && num % 3 == 0而不是num % 3 == 0 && num % 5 == 0 && num % 7 == 0?原因很简单,前面都说了在&&情况下,情况少发生的就放在前面,num % 7 == 0相对num % 3 == 0更少发生,所以如果第一个条件不满足,就不会去算第二个条件,减少计算量,直接走下一个else if语句。

而单个条件判断,最好从小到大,因为小的满足的情况更多,一旦满足了,就不会走下一个else if语句,减少计算量,从而提高效率。

归根到底,是算法问题,怎样让程序做个更快更好,算法很重要,目前接触到的算法不多,以后再详细探讨。

    原文作者:薛定谔的猴子
    原文地址: https://www.jianshu.com/p/f18513bebb08
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞