用代码带你“深入”理解90%的初学者都没理解清楚的Java基础知识——流程控制

Posted 爱分享的板栗老哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用代码带你“深入”理解90%的初学者都没理解清楚的Java基础知识——流程控制相关的知识,希望对你有一定的参考价值。

大家好呀,上一期基础加固篇反向很热烈呀,这期我就就像在代码中带大家回顾Java中的基础知识,可以自己敲一下看看,加深理解。根据这些知识我还整理了一张图,基本上每个知识点都有注释详解。大家有需要的可以私信找我要。

if语句

在Java程序中,如果要根据条件来决定是否执行某一段代码,就需要if语句。
if语句的基本语法是:
if (条件) {
// 条件满足时执行
}
根据if的计算结果(true还是false),JVM决定是否执行if语句块(即花括号{}包含的所有语句)。
让我们来看一个例子:

// 条件判断
public class Main {
    public static void main(String[] args) {
        int n = 70;
        if (n >= 60) {
            System.out.println("及格了");
        }
        System.out.println("END");
    }
}

运行结果:

及格了
END

当条件n >= 60计算结果为true时,if语句块被执行,将打印"及格了",否则,if语句块将被跳过。修改n的值可以看到执行效果。

if…else if

可以用多个if … else if …串联。例如:

// 条件判断
public class Main {
    public static void main(String[] args) {
        int n = 70;
        if (n >= 90) {
            System.out.println("优秀");
        } else if (n >= 60) {
            System.out.println("及格了");
        } else {
            System.out.println("挂科了");
        }
        System.out.println("END");
    }
}

运行结果:

及格了
END

判断引用类型相等:equals( )方法

在Java中,判断值类型的变量是否相等,可以使用==运算符。但是,判断引用类型的变量是否相等,==表示“引用是否相等”,或者说,是否指向同一个对象。例如,下面的两个String类型,它们的内容是相同的,但是,分别指向不同的对象,用==判断,结果为false:

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1 == s2) {
            System.out.println("s1 == s2");
        } else {
            System.out.println("s1 != s2");
        }
    }
}

运行结果:

hello
hello
s1 != s2

要判断引用类型的变量内容是否相等,必须使用equals()方法:

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "HELLO".toLowerCase();
        System.out.println(s1);
        System.out.println(s2);
        if (s1.equals(s2)) {
            System.out.println("s1 equals s2");
        } else {
            System.out.println("s1 not equals s2");
        }
    }
}

运行结果:

hello
hello
s1 equals s2

注意:执行语句s1.equals(s2)时,如果变量s1为null,会报NullPointerException:

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}

运行结果:

Exception in thread “main” java.lang.NullPointerException
at Main.main(Main.java:5)

要避免NullPointerException错误,可以利用短路运算符&&:

// 条件判断
public class Main {
    public static void main(String[] args) {
        String s1 = null;
        if (s1 != null && s1.equals("hello")) {
            System.out.println("hello");
        }
    }
}

还可以把一定不是null的对象"hello"放到前面:例如:if ("hello".equals(s)) { ... }

switch 多重选择

除了if语句外,还有一种条件判断,是根据某个表达式的结果,分别去执行不同的分支。
例如,在游戏中,让用户选择选项:
单人模式
多人模式
退出游戏
这时,switch语句就派上用场了。
switch语句根据switch (表达式)计算的结果,跳转到匹配的case结果,然后继续执行后续语句,直到遇到break结束执行。
我们看一个例子:

// switch
public class Main {
    public static void main(String[] args) {
        int option = 1;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
            break;
        case 2:
            System.out.println("Selected 2");
            break;
        case 3:
            System.out.println("Selected 3");
            break;
        }
    }
}

运行结果:

Selected 1

如果option的值没有匹配到任何case,例如option = 99,那么,switch语句不会执行任何语句。这时,可以给switch语句加一个default,当没有匹配到任何case时,执行default:

// switch
public class Main {
    public static void main(String[] args) {
        int option = 99;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
            break;
        case 2:
            System.out.println("Selected 2");
            break;
        case 3:
            System.out.println("Selected 3");
            break;
        default:
            System.out.println("Not selected");
            break;
        }
    }
}

运行结果:

Not selected

如果把switch语句翻译成if语句,那么上述的代码相当于:

if (option == 1) {
    System.out.println("Selected 1");
} else if (option == 2) {
    System.out.println("Selected 2");
} else if (option == 3) {
    System.out.println("Selected 3");
} else {
    System.out.println("Not selected");
}

对于多个==判断的情况,使用switch结构更加清晰。

switch语句还可以匹配字符串。字符串匹配时,是比较“内容相等”

switch语句还可以匹配字符串。字符串匹配时,是比较“内容相等”。例如:

// switch
public class Main {
    public static void main(String[] args) {
        String fruit = "apple";
        switch (fruit) {
        case "apple":
            System.out.println("Selected apple");
            break;
        case "pear":
            System.out.println("Selected pear");
            break;
        case "mango":
            System.out.println("Selected mango");
            break;
        default:
            System.out.println("No fruit selected");
            break;
        }
    }
}

运行结果:

Selected apple

穿透性

使用switch时,注意case语句并没有花括号{},而且,case语句具有“穿透性”,漏写break将导致意想不到的结果:

// switch
public class Main {
    public static void main(String[] args) {
        int option = 2;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
        case 2:
            System.out.println("Selected 2");
        case 3:
            System.out.println("Selected 3");
        default:
            System.out.println("Not selected");
        }
    }
}

运行结果:

Selected 2
Selected 3
Not selected

当option = 2时,将依次输出"Selected 2"、“Selected 3”、“Not selected”,原因是从匹配到case 2开始,后续语句将全部执行,直到遇到break语句。因此,任何时候都不要忘记写break。

循环

循环语句就是让计算机根据条件做循环计算,在条件满足时继续循环,条件不满足时退出循环。

while循环

Java提供的while条件循环。它的基本用法是:

while (条件表达式) {
    循环语句
}
// 继续执行后续代码

while循环在每次循环开始前,首先判断条件是否成立。如果计算结果为true,就把循环体内的语句执行一遍,如果计算结果为false,那就直接跳到while循环的末尾,继续往下执行。
我们用while循环来累加1到100,可以这么写:

// while
public class Main {
    public static void main(String[] args) {
        int sum = 0; // 累加的和,初始化为0
        int n = 1;
        while (n <= 100) { // 循环条件是n <= 100
            sum = sum + n; // 把n累加到sum中
            n ++; // n自身加1
        }
        System.out.println(sum); // 5050
    }
}

运行结果:

5050

do while循环

在Java中,while循环是先判断循环条件,再执行循环。而另一种do while循环则是先执行循环,再判断条件,条件满足时继续循环,条件不满足时退出。它的用法是:
do {
执行循环语句
} while (条件表达式);
可见,do while循环会至少循环一次。
我们把对1到100的求和用do while循环改写一下:

// do-while
public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int n = 1;
        do {
            sum = sum + n;
            n ++;
        } while (n <= 100);
        System.out.println(sum);
    }
}

运行结果:

5050

使用do while循环时,同样要注意循环条件的判断。
注意到while循环是先判断循环条件,再循环,因此,有可能一次循环都不做。

for循环

for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i。
我们把1到100求和用for循环改写一下:

// for
public class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i=1; i<=100; i++) {
            sum = sum + i;
        }
        System.out.println(sum);
    }
}

运行结果:

5050

在for循环执行前,会先执行初始化语句int i=1,它定义了计数器变量i并赋初始值为1,然后,循环前先检查循环条件i<=100,循环后自动执行i++,因此,和while循环相比,for循环把更新计数器的代码统一放到了一起。在for循环的循环体内部,不需要去更新变量i。
因此,for循环的用法是:

for (初始条件; 循环检测条件; 循环后更新计数器) {
    // 执行语句
}

循环控制语句

break:跳出当前循环
continue:提前结束本次循环,直接继续执行下次循环

最后,祝大家早日学有所成,拿到满意offer,快速升职加薪,走上人生巅峰。 可以的话请给我一个三连支持一下我哟,我们下期再见

以上是关于用代码带你“深入”理解90%的初学者都没理解清楚的Java基础知识——流程控制的主要内容,如果未能解决你的问题,请参考以下文章

带你深入理解多线程 --- 锁策略篇

带你深入理解多线程 --- 锁策略篇

图解 React-router 带你深入理解路由本质

6张图,带你深入理解GitOps,真硬核!

RTOS的最通俗理解行业大佬用一篇文章带你快速理解RTOS

3000字带你深入理解二叉树(图解剖析)