📜  Java中的循环

📅  最后修改于: 2020-02-12 15:07:25             🧑  作者: Mango

编程语言中的循环是一项功能,可在某些条件评估为真时,重复执行一组指令/功能。
Java提供了三种执行循环的方式。尽管所有方式都提供相似的基本功能,但是它们的语法和条件检查时间有所不同。

  1. while循环: while循环是一个控制流语句,它允许根据给定的布尔条件重复执行代码。while循环可被视为重复的if语句。
    语法 :
    while(布尔条件)
    {
       循环语句...
    }

    流程图:

  • While循环从条件检查开始。如果评估结果为true,则执行循环主体语句,否则执行循环之后的第一条语句。因此,它也称为进入控制循环
  • 一旦条件评估为真,就执行循环主体中的语句。通常,这些语句包含下一个迭代要处理的变量的更新值。
  • 当条件变为假时,循环终止,标志着其生命周期的结束。
    // Java程序,展示while循环的使用
    class whileLoopDemo
    {
        public static void main(String args[])
        {
            int x = 1;
            // x大于4,跳出
            while (x <= 4)
            {
                System.out.println("x的值:" + x);
                // 每次循环,累加x的值
                x++;
            }
        }
    }

    输出:

    x的值:1
    x的值:2
    x的值:3
    x的值:4

for循环: for循环提供了一种简洁的编写循环结构的方法。与while循环不同,for语句在一行中表达了初始化、条件和增量/减量,从而提供了更短,更易于调试的循环结构。
语法: 

for (initialization condition; testing condition;
                              increment/decrement)
{
    statement(s)
}

流程图:

  1. 初始化条件:在这里,我们初始化使用中的变量。它标志着for循环的开始。可以使用已经声明的变量,也可以声明一个局部变量,仅用于循环。
  2. 测试条件:用于测试循环的退出条件。它必须返回一个布尔值。这也是一个入口控制循环,因为在执行循环语句之前先检查条件。
  3. 语句执行:条件评估为真后,将执行循环主体中的语句。
  4. 增量/减量:用于更新变量以进行下一次迭代。
  5. 循环终止:当条件变为假时,循环终止,标志着其生命周期的结束。
    // Java代码,展示for循环的例子
    class forLoopDemo
    {
        public static void main(String args[])
        {
            // for循环在x=2开始,在x>4结束
            for (int x = 2; x <= 4; x++)
                System.out.println("x的值:" + x);
        }
    }

    输出:

    x的值:2
    x的值:3
    x的值4

    增强的For循环

    Java还包括Java 5中引入的for循环的另一个版本。增强的for循环提供了一种更简单的方法来遍历集合或数组的元素。它是不灵活的,仅在需要以顺序方式遍历元素而又不知道当前已处理元素的索引时才应使用。
    还要注意,使用增强的for循环时,对象/变量是不可变的,即,它确保数组中的值不能被修改,因此可以说是只读循环,其中您不能像其他循环那样更新值可以修改值的循环。
    我们建议尽可能使用此形式的for语句,而不要使用一般形式。
    语法:

    for (T element:Collection obj/array)
    {
        statement(s)
    }

    让我们以一个例子来演示如何使用增强的for循环来简化工作。假设有一个名称的数组,我们想打印该数组中的所有名称。让我们看一下这两个示例的区别:
    Enhanced for loop简化了工作,如下所示:

    // Java展示增强for循环
    public class enhancedforloop
    {
        public static void main(String args[])
        {
            String array[] = {"Ron", "琳琳", "东东"};
            // 增强for循环
            for (String x:array)
            {
                System.out.println(x);
            }
            /* 传统for循环写法
            for (int i = 0; i < array.length; i++)
            {
                System.out.println(array[i]);
            }
            */
        }
    }

    输出:

    Ron
    琳琳
    东东

     

do while: do while循环与while循环相似,只是执行语句后检查条件,因此是 Exit Control Loop的一个示例
语法:

do
{
    statements..
}
while (condition);

流程图:

  1. do while循环从语句的执行开始。第一次没有检查任何条件。
  2. 在执行语句并更新变量值之后,将检查条件的真值或假值。如果评估为true,则循环的下一个迭代开始。
  3. 当条件变为假时,循环终止,标志着其生命周期的结束。
  4. 重要的是要注意,do-while循环将在检查任何条件之前至少执行一次其语句,因此是退出控制循环的一个示例。
    // Java展示do-while循环示例
    class dowhileloopDemo
    {
        public static void main(String args[])
        {
            int x = 21;
            do
            {
                // 这行将被打印,即使条件是false
                System.out.println("x的值:" + x);
                x++;
            }
            while (x < 20);
        }
    }

    输出:

    x的值: 21

循环陷阱

  1. 无限循环:实现任何形式的循环时,最常见的错误之一是它可能永远不会退出,即循环运行了无限的次数。当条件由于某种原因失败时,就会发生这种情况。
    例子:
    //Java展示循环的弊端.
    public class LooppitfallsDemo
    {
        public static void main(String[] args)
        {
            // 这会创造一个无限循环
            for (int i = 5; i != 0; i -= 2)
            {
                System.out.println(i);
            }
            int x = 5;
            // 这也会创造一个无限循环.
            while (x == 5)
            {
                System.out.println("在循环内");
            }
        }
    }
  2. 另一个陷阱是,您可能会通过循环向集合对象中添加某些内容,从而导致内存不足。如果尝试执行以下程序,则一段时间后,将引发内存不足异常。
    // Java因循环导致的内存不足
    import java.util.ArrayList;
    public class Integer1
    {
        public static void main(String[] args)
        {
            ArrayList ar = new ArrayList<>();
            for (int i = 0; i < Integer.MAX_VALUE; i++)
            {
                ar.add(i);
            }
        }
    }

    输出:

    Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at Java.util.Arrays.copyOf(Unknown Source)
    at Java.util.Arrays.copyOf(Unknown Source)
    at Java.util.ArrayList.grow(Unknown Source)
    at Java.util.ArrayList.ensureCapacityInternal(Unknown Source)
    at Java.util.ArrayList.add(Unknown Source)
    at article.Integer1.main(Integer1.Java:9)