当前位置:首页分享Java从入门到放弃(十五):循环

Java从入门到放弃(十五):循环

循环语句是编程中一种非常重要的结构,它允许我们重复执行一段代码,直到满足某个条件为止。这种结构在处理需要重复操作的任务时非常有用,比如计算一系列数值的总和。

while循环

以计算从1到100的和为例,我们可以使用Java中的while循环来实现这一功能。下面是一个简单的Java代码示例,展示了如何使用while循环来计算这个序列的和:

public class Main {
    public static void main(String[] args) {
        int sum = 0; // 初始化累加和为0
        int n = 1; // 从1开始累加

        // 当n小于或等于100时,继续循环
        while (n <= 100) {
            sum = sum + n; // 将n的值累加到sum中
            n++; // 每次循环后,n自增1
        }

        System.out.println("1到100的和为: " + sum); // 输出结果,应为5050
    }
}

在这个例子中,while循环会在每次执行前先检查条件n <= 100是否为真。如果条件为真,循环体内的代码就会执行,然后将n的值加1。这个过程会一直重复,直到n的值大于100,此时循环结束。

然而,如果我们在循环的开始没有正确初始化n的值,或者没有在循环体内部适当地更新n,就可能导致错误的结果。例如,下面的代码段就没有得到正确的结果:

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int n = 0; // 错误的初始值,应该是1

        while (n <= 100) {
            n++; // 应该在累加之前先自增
            sum = sum + n;
        }

        System.out.println("错误的结果: " + sum); // 输出的结果不是5050
    }
}

死循环是编程中一种需要特别注意的情况,它指的是一个永远不满足退出条件的循环。这种循环会导致程序不断地执行循环体内的代码,从而消耗大量的CPU资源,使得用户感觉到电脑运行缓慢,甚至出现卡顿。因此,在编写循环时,我们必须确保循环有一个明确的退出条件,以避免死循环的发生。

然而,有时候即使循环条件看起来永远不会满足,程序也可能因为其他原因意外退出循环。例如,在下面的Java代码中,虽然循环条件n > 0看似会导致死循环,但实际上,由于Java中的int类型有一个最大值(Integer.MAX_VALUE),当变量n达到这个最大值后,再进行自增操作时,它的值会溢出变成负数,从而意外地满足了退出条件n > 0,导致循环结束。

public class Main {
    public static void main(String[] args) {
        int sum = 0;
        int n = 1;
        while (n > 0) {
            sum = sum + n;
            n++;
        }
        System.out.println(n); // 输出的是溢出后的负数,例如:-2147483648
        System.out.println(sum); // 输出的是累加到`n`溢出前的和
    }
}

 

do while循环

在Java编程语言中,do-while循环是一种特殊的循环结构,它与while循环的主要区别在于执行顺序。do-while循环确保循环体至少执行一次,然后再评估循环条件。如果条件为真,则继续执行循环体;如果条件为假,则退出循环。这种循环结构的语法如下:

do {
    // 执行循环体内的语句
} while (条件表达式);

利用do-while循环,我们可以对从1到100的整数求和的问题进行改写。下面是使用do-while循环实现的代码示例:

public class Main {
    public static void main(String[] args) {
        int sum = 0; // 初始化求和变量为0
        int n = 1; // 初始化计数变量为1

        do {
            sum = sum + n; // 将当前的n累加到sum中
            n++; // 计数变量n自增1
        } while (n <= 100); // 当n大于100时,退出循环

        System.out.println("1到100的和为: " + sum); // 输出求和结果
    }
}

for循环

Java中的for循环是一种非常强大且常用的循环结构,它通过使用一个计数器(通常称为迭代变量)来控制循环的执行。for循环的语法结构包括三个部分:初始化表达式、循环条件和更新表达式,它们被包含在循环的圆括号中。循环体中的代码会重复执行,直到循环条件不再满足。

下面是使用for循环来计算从1到100的和的代码示例:

public class Main {
    public static void main(String[] args) {
        int sum = 0; // 初始化求和变量为0
        // for循环的三个部分:初始化表达式、循环条件、更新表达式
        for (int i = 1; i <= 100; i++) {
            sum = sum + i; // 将当前的i累加到sum中
        }
        System.out.println("1到100的和为: " + sum); // 输出求和结果
    }
}

for循环的这种结构使得它非常适合于在已知循环次数的情况下使用。此外,for循环也可以用来遍历数组或集合中的所有元素。例如,下面的代码展示了如何使用for循环来计算一个整型数组中所有元素的和:

public class Main {
    public static void main(String[] args) {
        int[] ns = {1, 4, 9, 16, 25}; // 定义一个整型数组
        int sum = 0; // 初始化求和变量为0
        // 使用for循环遍历数组
        for (int i = 0; i < ns.length; i++) {
            System.out.println("i = " + i + ", ns[i] = " + ns[i]); // 输出当前索引和对应的数组元素
            sum = sum + ns[i]; // 将数组元素累加到sum中
        }
        System.out.println("数组元素的和为: " + sum); // 输出求和结果
    }
}

在这个例子中,for循环的循环条件i < ns.length确保了循环会遍历数组的每一个元素。每次循环,都会输出当前索引i和对应的数组元素ns[i],并将数组元素累加到sum变量中。当i的值达到数组的长度时,循环结束。

在Java中使用for循环时,有几个重要的注意事项需要遵守,以确保代码的正确性和清晰性。

首先,for循环的初始化部分总是会被执行至少一次,即使循环体可能不会执行。这是因为for循环的初始化语句是在循环开始之前执行的。此外,for循环确实可能执行零次,这通常发生在循环条件一开始就不满足的情况下。

其次,避免在for循环体内部修改计数器变量。虽然这样不会引起编译错误,但可能会导致难以理解的逻辑错误,因为for循环的更新表达式已经设计用来控制循环的迭代。例如,在下面的代码中:

for (int i = 0; i < ns.length; i++) {
    System.out.println(ns[i]);
    i = i + 1;
}

这段代码会导致数组元素只打印了一半,因为每次循环后,i的值被增加了2(一次是循环体内部的i = i + 1,另一次是for循环自带的i++)。正确的做法是在for循环的更新表达式中修改计数器,而不是在循环体内部。

如果你需要跳过某些迭代,比如只访问索引为奇数的数组元素,你应该这样写:

for (int i = 0; i < ns.length; i += 2) {
    System.out.println(ns[i]);
}

通过将更新表达式设置为i += 2,我们确保每次循环只增加2,从而只访问奇数索引的数组元素。

最后,推荐将计数器变量定义在for循环内部,这样可以限制变量的作用域,使其仅在循环体内有效。这样做有助于避免不必要的错误,并保持代码的清晰和简洁。例如:

int[] ns = {1, 4, 9, 16, 25};
// 计数器i的作用域限制在for循环内部
for (int i = 0; i < ns.length; i++) {
    System.out.println(ns[i]);
}
// 循环结束后,i不再可用

如果计数器变量在循环外部定义,那么它在循环结束后仍然可用,这可能会导致潜在的错误,尤其是当循环结束后还尝试访问或修改该变量时。因此,最好的做法是将计数器变量的作用域限制在for循环内部。

灵活使用for循环

 在Java中,for循环的初始化、条件和更新部分都是可选的,这意味着你可以编写不完整的for循环,尽管这样做并不常见,也不推荐,因为它可能会导致代码的可读性和可维护性降低。以下是几种省略了部分语句的for循环示例:

// 省略了结束条件的for循环
for (int i = 0; ; i++) {
    // 循环体
    // 循环条件需要手动控制,否则可能变成死循环
}

// 省略了结束条件和更新语句的for循环
for (int i = 0; ; ) {
    // 循环体
    // 需要在循环内部同时控制i的更新和退出条件
}

// 省略了所有语句的for循环
for (;;) {
    // 循环体
    // 这是一个典型的死循环,除非在循环体内部有退出的逻辑
}

for each循环

Java还提供了一种更加简洁的for-each循环,专门用于遍历集合和数组。for-each循环的语法结构如下:

for (元素类型 单个元素 : 集合或数组) {
    // 循环体,使用单个元素
}

使用for-each循环,可以更加简单地访问数组的每个元素,而不需要使用索引:

int[] ns = {1, 4, 9, 16, 25};
// 使用for-each循环遍历数组
for (int n : ns) {
    System.out.println(n);
}

在这个例子中,for-each循环会自动迭代数组ns中的每个元素,并将每个元素赋值给变量n。这种循环方式不仅代码更简洁,而且避免了使用索引时可能出现的错误。

for-each循环不仅限于数组,它还可以用于遍历实现了Iterable接口的所有对象,如ListSetMap等。这种循环方式提供了一种简单且高效的方式来处理集合中的元素,而无需关心集合的内部实现细节。然而,需要注意的是,for-each循环不允许修改集合的大小,也不能通过索引来访问元素。如果需要进行这些操作,应该使用传统的for循环。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。
0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧