编程思想 之「控制流程」

温馨提示:本系列博文(含示例代码)已经同步到 GitHub,地址为「java-skills」,欢迎感兴趣的童鞋StarFork,纠错。

在 Java 中,if-else是最基本的控制程序流程的形式,例如

if(boolean-expression)
    statement
else
    statement

其中else是可选的,如果省略else,则简化为如下形式:

if(boolean-expression)
    statement

迭代

常见的迭代形式有三种,分别为forwhiledo-while,其中whiledo-while的唯一区别就是do-while至少会执行一次循环。在一个控制表达式中,只有for循环可以定义多个变量(且变量的生存周期为循环体内部),在其他任何选择或者迭代语句中都不能使用这种方式。

在这里,着重介绍for循环,其有两种形式,一种是普通的for循环,其形式如下:

for(initialization; boolean-expression; step) {
    statement
}

另一种是高级的for循环,我们也称之为foreach循环,其形式如下:

for(variable-type variable-name : collection) {
    statement
}
  • 对于一般的for循环,其第 1 部分通常用于给变量进行初始化;第 2 部分给出每次新一轮循环执行之前的判断条件;第 3 部分则给出迭代规则,也就是变量的更新方式。尽管 Java 允许在for循环的各个部分放置任何表达式,但有一条不成文的规则,那就是:for循环的 3 个部分应该对同一个变量进行初始化、判断和更新。

此外,在循环的时候,检测两个浮点数是否相等需要格外的小心,例如:

for(double x = 0; x != 10; x += 0.1)

这个for循环就可能永远都不会结束。因为 0.1 无法精确地用二进制表示,所以,x的值将从9.99999999999998直接跳到10.09999999999998. 如果在该for循环的下面加一条输出语句,好吧,你将会看到控制台疯狂输出。

当我们在for循环的第 1 部分声明一个变量之后,这个变量的作用域就是整个for循环,在for循环结束之后,这个变量就将被清理掉,无法继续使用。因此,如果我们想在for循环结束之后,继续使用这个变量,那么我们就得在这个for循环开始之前定义这个变量,简单点,在这个for循环的上一行定义就可以。与之相反的,在while循环中定义的变量,当while循环结束之后,仍然可以继续使用这个变量。

  • 对于高级的for循环,其可以用来依次处理数组中的每一个元素(其他类型的元素集合亦可),而不用指定具体的数组角标。在这里,定义的变量用于临时存储集合中的每一个元素,并执行相应的语句,集合表达式必须是一个数组或者是一个实现了Iterable接口的类对象。

虽然高级的for循环可以帮助我们快速遍历数组(以其为例)中的全部元素,但是大多数时候,我们还得使用一般的for循环,例如我们仅需要操作数组中的某一个元素,或者利用数组的角标完成某种需求等等。

下面,给出一个利用上述两种for循环测试输出数组元素的代码示例,感兴趣的同学可以自己运行体验一下:

package com.hit.chapter4;

import java.util.Arrays;

/**
 * author:Charies Gavin
 * date:2017/12/20,9:43
 * https:github.com/guobinhit
 * description:测试两种 for 循环方法
 */
public class ForLoop {
    public static void main(String[] args) {
        // 创建并初始化一个整型数据
        int[] arr = new int[]{2, 0, 1, 5, 11, 20};

        System.out.println("普通的 for 循环方法:");

        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }

        System.out.println();
        System.out.println("高级的 for 循环方法:");

        for (int i : arr) {
            System.out.print(i + " ");

        }

        System.out.println();

        System.out.println("用 Arrays 的 toString() 方法打印数组:");
        System.out.println(Arrays.toString(arr));

        // 小心,这里有毒 ~~~
//        doubleForTest();
    }

    /**
     * 测试 double 数据类型的 for 循环
     */
    private static void doubleForTest() {
        for (double x = 0; x != 10; x += 0.1) {
            System.out.println(x);
        }
    }
}

for

如上图所示,我们还能够发现另外一种更为简单的打印数组中所有元素的方法,那就是:利用Arrays类中的toString()方法,其返回一个包含数组中所有元素的字符串,这个字符串被放置在一个中括号内部并用逗号进行分隔。

return、break、continue、goto

return关键字有两种用途:

  • 指定一个方法返回什么值;
  • 强行退出当前的方法,并返回那个值。

在任何迭代语句的主体部分,都可以用breakcontinue控制循环的流程,其中:

  • break用于强行退出循环,不执行循环中剩余的语句;
  • continue用于停止执行当前的迭代,然后退回循环起始处,开始下一次迭代。

无论break还是continue其本身都只能中断最内层的循环。如果想中断外层的选择,则需要配置标签机制共同使用。虽然 Java 中没有goto关键字(其在源码级上做跳转),但goto仍然是其保留字且有类似于goto的标签机制。标签起作用的唯一的地方刚好是在迭代语句之前。而在迭代之前设置标签的唯一理由是:我们希望在其中嵌套另一个迭代或者一个开关

同样,在 Java 里需要使用标签的唯一理由就是因为有循环嵌套的存在,并且想从多层嵌套中break或者continue。当然,如果想在中断循环的同时退出,用一个return即可。此外,在 Java 中,有两种无限循环的格式,分别为for(;;)while(true),编译器将两者视为同一回事。


———— ☆☆☆ —— 返回 -> 那些年,关于 Java 的那些事儿 <- 目录 —— ☆☆☆ ————

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安正勋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值