Java零基础入门笔记:(3)程序控制

news2025/3/13 16:41:09

 前言

本笔记是学习狂神的java教程,建议配合视频,学习体验更佳。

【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili

Scanner对象

之前我们学的基本语法中我们并没有实现程序和人的交互,但是Java给我们提供了这样一个工具类,我们可以获取用户的输入。

Scanner 类是 Java 中的一个实用工具类,位于 java.util 包中,主要用于从用户输入、文件或其他输入源中读取数据。它提供了一种简单且灵活的方式来解析不同类型的数据,例如字符串、整数、浮点数等。

-

scanner.hasNext()

scanner.hasNext()Scanner 类的一个方法,用于检查输入源中是否还有下一个输入项。它是一个布尔方法,返回 true 表示输入源中还有下一个输入项,返回 false 表示没有更多输入项。

通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext() 与hasNextLine()判断是否还有输入的数据。

-

scanner.next()

scanner.next() 是 Java 中 Scanner 类的一个方法,用于从输入源中读取下一个单词(token)。它会根据默认的分隔符(通常是空白字符,包括空格、制表符和换行符)来分隔输入内容,并返回下一个单词。

  1. 一定要读取到有效字符后才可以结束输入。
  2. 对输入有效字符之前遇到的空白,next()方法会自动将其去掉。
  3. 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  4. next()不能得到带有空格的字符串。

-

下面这段代码使用hasNext()判断有无字符串输入,然后使用.next()接收字符串输入。

  1. 创建了一个Scanner对象,命名为scannerSystem.in是Java标准输入流,通常指向键盘输入。通过Scanner类,可以方便地从键盘读取用户输入的数据。

  2. 调用了scanner.hasNext()方法。hasNext()方法用于检查Scanner对象是否还有下一个输入项(即用户是否输入了内容)。如果用户输入了内容,hasNext()返回true;否则返回false

  3. 如果scanner.hasNext()返回true,程序会进入if语句块。这行代码调用了scanner.next()方法,用于读取用户输入的下一个字符串。next()方法会读取用户输入的内容,直到遇到空白符(如空格、换行符等)为止,并将读取到的内容存储到变量str中。

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);    // 创建一个scanner对象,用于接收键盘数据
        System.out.println("接收:");

        if (scanner.hasNext()){     // 判断有无输入字符串
            String str = scanner.next();    // 使用next方法接收
            System.out.println("内容为"+str);
        }

        scanner.close();
    }
}

输出示例

接收:
hello world
内容为hello

-

scanner.hasNextLine()

scanner.hasNextLine() 是 Java 中 Scanner 类的一个方法,用于检查输入源(如键盘输入或文件输入)中是否还有下一行数据。它的返回值是一个布尔值(boolean

通过Scanner类的next()与nextLine()方法获取输入的字符串,在读取前我们一般需要使用hasNext() 与hasNextLine()判断是否还有输入的数据。

-

scanner.nextLine()

  • 作用:读取输入中的整行内容,直到遇到换行符为止。

  • 行为:从当前位置开始读取,直到遇到换行符(\n\r\n),并将换行符之前的全部内容作为结果返回。

  • 特点:会读取整行内容,包括空格和制表符,但不会读取换行符本身。

下面这段代码使用hasNextLine()判断有无字符串输入,然后使用.nextline()接收字符串输入。

  1. 创建了一个Scanner对象,命名为scannerSystem.in是Java标准输入流,通常指向键盘输入。通过Scanner类,可以方便地从键盘读取用户输入的数据。

  2. 调用了scanner.hasNextLine()方法。hasNextLine()方法用于检查Scanner对象是否还有下一行(即用户是否输入了内容)。如果用户输入了内容,hasNextLine()返回true;否则返回false

  3. 如果scanner.hasNextLine()返回true,程序会进入if语句块。这行代码调用了scanner.nextline()方法,用于读取用户输入的下一个字符串。nextline()方法会读取用户输入的内容,直到遇到换行符(\n\r\n)为止,并将读取到的内容存储到变量str中。

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);    // 创建一个scanner对象,用于接收键盘数据
        System.out.println("接收:");

        if (scanner.hasNextLine()){     // 判断有无输入字符串
            String str = scanner.nextLine();    // 使用next方法接收
            System.out.println("内容为"+str);
        }

        scanner.close();
    }
}

输出结果示例

接收:
hello world
内容为hello world

 -

其他

scanner.hasNextInt()

  • 作用:检查输入源中是否下一个数据项是整数

  • 返回值:布尔值(boolean)。如果下一个数据项可以被解析为整数(int 类型),则返回 true;否则返回 false

  • 特点

    • 会跳过前面的空白符(空格、制表符、换行符等)。

    • 如果输入不符合整数格式(如包含字母或小数点),则返回 false

scanner.nextInt()

  • 作用:读取输入源中的下一个整数

  • 返回值:整数(int 类型)。

  • 特点

    • 会跳过前面的空白符。

    • 如果输入不符合整数格式,会抛出 InputMismatchException 异常。

    • 只读取一个整数,不会读取换行符。

scanner.hasNextFloat()

  • 作用:检查输入源中是否下一个数据项是浮点数

  • 返回值:布尔值(boolean)。如果下一个数据项可以被解析为浮点数(float 类型),则返回 true;否则返回 false

  • 特点

    • 会跳过前面的空白符。

    • 浮点数可以包含小数点和科学计数法(如 3.141.23e-10)。

    • 如果输入不符合浮点数格式(如包含字母或多余的符号),则返回 false

scanner.nextFloat()

  • 作用:读取输入源中的下一个浮点数

  • 返回值:浮点数(float 类型)。

  • 特点

    • 会跳过前面的空白符。

    • 如果输入不符合浮点数格式,会抛出 InputMismatchException 异常。

    • 只读取一个浮点数,不会读取换行符

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        // 创建一个scanner对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);

        int i = 0;
        float f = 0.0f;

        System.out.println("请输入整数:");
        if (scanner.hasNextInt()){
            i = scanner.nextInt();
            System.out.println("整数:"+i);
        }else {
            System.out.println("输入的不是整数!");
        }

        System.out.println("请输入小数:");
        if (scanner.hasNextFloat()){
            f = scanner.nextFloat();
            System.out.println("小数:"+f);
        }else {
            System.out.println("输入的不是小数!");
        }

        scanner.close();
    }
}

输入和输出示意:

请输入整数:
10
整数数据:10
请输入小数:
1.1
小数数据:1.1
 
请输入整数:
10.1
输入的不是整数数据!  // 这里会直接跳过小数部分的输入,直接把10.1赋值给f
请输入小数:
10.1
小数数据:10.1

-

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {    // 求和和求平均
        // 创建一个scanner对象,用于接收键盘数据
        Scanner scanner = new Scanner(System.in);

        double sum = 0;
        int m = 0;
        while (scanner.hasNextDouble()){
            double x = scanner.nextDouble();
            System.out.println("你输入了"+x);
            m++;
            sum += x;
        }

        System.out.println("sum:"+sum);
        System.out.println("mean:"+(sum/m));

        scanner.close();
    }
}

 输入输出示例:

请输入浮点数(输入非数字结束):
3.5
2.5
4.0
abc

你输入了:3.5
你输入了:2.5
你输入了:4.0
总和:10.0
平均值:3.3333333333333335

-

-

顺序结构

JAVA的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行

顺序结构是最简单的算法结构。

语句与语句之间,框与框之间是按从上到下的顺序进行的,它是由若干个依次执行的处理步骤组成的,它是任何一个算法都离不开的一种基本算法结构。

package com. kuang.struct;
 
public class shunXuDemo {
    public static void main(String[] args) {
        System.out.println("hello1");
        System.out.println("hello2");
        System.out.println("hello3");
        System.out.println("he1lo4");
        System.out.println("he11o5");
    }
}

输出

hello1
hello2
hello3
hello4
hello5

-

-

选择结构

if单选择结构

if单循环的流程如下:

  1. 条件判断:检查 if 语句中的条件是否为 true

  2. 执行代码块:如果条件为 true,则执行 if 代码块中的语句;如果条件为 false,则跳过代码块,继续执行后续代码。

if(布尔表达式){
  //如果布尔表达式为true将执行的语句
}

下面的代码演示了if单循环和字符串判等的流程: 

  1. 读取用户输入:使用 scanner.nextLine() 读取用户输入的一整行内容,并存储到变量 s 中。

  2. 判断输入内容

    • 如果用户输入的内容是 "He11o",则打印变量 s 的内容。

    • 如果输入不是 "He11o",则跳过打印。

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入内容:");
        String s = scanner.nextLine();

        if (s.equals("He11o")){    //equals:判断字符串是否相等
            System.out.println(s);
        }

        System.out.println("End");
        scanner.close();
    }
}

输出示例:

请输入内容:
hello
End

请输入内容:
He11o
He11o
End

-

if双选择结构

现在有个需求,公司要收购一个软件,成功了,给人支付100万元,失败了,自己找人开发。这样的需求用一个if就搞不定了,我们需要有两个判断,需要一个双选择结构,所以就有了if-else结构。

if-else 双分支结构的流程可以概括为以下几步:

  1. 条件判断
    检查 if 语句中的条件是否为 true

  2. 执行分支

    • 如果条件为 true,执行 if 代码块中的语句。

    • 如果条件为 false,跳过 if 代码块,执行 else 代码块中的语句。

  3. 结束
    执行完 ifelse 代码块后,程序继续执行后续代码。

if(布尔表达式){
    //如果布尔表达式的值为true
}else{
    //如果布尔表达式的值为false
}

以下代码演示了if双选择的使用方法:

  1. 读取用户输入的成绩:使用 scanner.nextInt() 读取用户输入的整数,并存储到变量 score 中。

  2. 判断成绩是否及格

    • 如果 score > 60,打印 "及格"

    • 否则,打印 "不及格"

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        //考试分数大于60就是及格,小于60分就不及格。
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入成绩:");
        int score = scanner.nextInt();

        if (score>60){
            System.out.println("及格");
        }else {
            System.out.println("不及格");
        }

        scanner.close();
    }
}

输出示例:

请输入成绩:
77
及格


请输入成绩:
44
不及格

-

if多选择结构

我们发现刚才的代码不符合实际情况,真实的情况还可能存在ABCD,存在区间多级判断。比如90-100就是A,80-90就是B..等等,在生活中我们很多时候的选择也不仅仅只有两个,所以我们需要一个多选择结构来处理这类问题!

if多选择的流程如下:

  1. 条件判断

    • 从第一个 if 条件开始判断。

    • 如果 if 条件为 true,执行 if 代码块中的语句,然后跳到步骤5。

    • 如果 if 条件为 false,继续判断下一个 else if 条件。

  2. 依次判断 else if 条件

    • 按顺序判断每个 else if 条件。

    • 如果某个 else if 条件为 true,执行对应的代码块,然后跳到步骤5。

    • 如果所有 else if 条件都为 false,执行步骤3。

  3. 执行 else 代码块

    • 如果所有 ifelse if 条件都不成立,执行 else 代码块。

注意事项:

  • if 语句至多有1个 else 语句,else 语句在所有的 else if 语句之后。
  • if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
  • 一旦其中一个 else if 语句检测为true,其他的 else if 以及 etse 语句都将跳过执行。
if(布尔表达式 1){
    //如果布尔表达式 1的值为true执行代码
}else if(布尔表达式 2){
    //如果布尔表达式 2的值为true执行代码
}else if(布尔表达式 3){
    //如果布尔表达式 3的值为true执行代码
}else {
    //如果以上布尔表达式都不为true执行代码
}

package scanner;
import java.util.Scanner;

public class demo1 {
    public static void main(String[] args) {
        //考试分数大于60就是及格,小于60分就不及格。
        Scanner scanner = new Scanner(System.in);

        /*
        if 语句至多有1个 else 语句,else 语句在所有的 else if 语句之后。
        if 语句可以有若干个 else if 语句,它们必须在 else 语句之前。
        一旦其中一个 else if 语句检测为true,其他的 else if 以及 etse 语句都将跳过执行。
        */

        System.out.println("请输入成绩:");
        int score = scanner.nextInt();

        if ( score==100){
            System.out.println("恭喜满分");
        }else if (score<100 && score>=90){
            System.out.println("A级");
        }else if (score<90 && score>=80){
            System.out.println("B级");
        }else if (score<80 && score>=70){
            System.out.println("c级");
        }else if (score<70 && score>=60){
            System.out.println("D级");
        }else if (score<60 && score>=0){
            System.out.println("不及格");
        }else {
            System.out.println("成绩不合法");
        }

        scanner.close();
    }
}

-

嵌套的if结构

使用嵌套的if..else语句是合法的。也就是说你可以在另一个if或者else if语句中使用if 或者else if 语句。你可以像if 语句一样嵌套else if...else。

if(布尔表达式 1){
    如果布尔表达式 1的值为true执行代码
    if(布尔表达式 2){
        如果布尔表达式 2的值为true执行代码
    }
}

列如下面的代码示例中,用户输入一个1-100的数字,我们使用Java通过二分查找,找到对应的数字(二分查找属于超纲内容,可以先不理解其思想)

  • 在下面的代码中,我们在第一个if中嵌套了一个while(见循环结构),然后又在其中嵌套了一个if
package scanner;

import java.util.Scanner;

public class demo_sc {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入一个1-100的数字:");

        if (scanner.hasNextInt()){
            int x = scanner.nextInt();

            int left = 1, right=100;
            int mid = (left+right)/2;
            while(mid != x){
                if (x>mid){
                    left = mid+1;
                    mid = (left+right)/2;
                }else{
                    right = mid - 1;
                    mid = (left+right)/2;
                }
            }

            System.out.println(mid);
        }

    }
}

-

switch多选择结构

多选择结构还有一个实现方式就是switch case语句。

switch流程如下:

  1. 计算表达式的值:计算 switch 语句中表达式的值。

  2. 匹配 case 标签:将表达式的值与每个 case 标签的值进行比较,直到找到匹配的 case

  3. 执行匹配的代码块:从匹配的 case 标签开始执行代码,直到遇到 break 语句或 switch 语句结束。

  4. 执行 default 分支(可选):如果没有任何 case 标签与表达式的值匹配,且存在 default 分支,则执行 default 分支的代码。

switch(expression){
    case value :
        //语句
        break; //可选
    case value :
        //语句
        break; //可选
    //你可以有任意数量的case语句
    default : //可选
        //语句
}
  • switch case语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
  • switch语句中的变量类型可以是:byte、short、int或者char、string。
  • 从Java SE7开始,switch支持字符串String 类型了,同时case标签必须为字符串常量或字面量。

-

下面的代码演示了case穿透:在 switch 语句中,如果某个 case 分支没有以 break 语句结束,程序会继续执行下一个 case 分支,直到遇到 breakswitch 结束。这种现象称为 case 穿透case 跌落

  1. grade 的值为 'c' 时,程序会匹配到 case 'c'

  2. case 'c' 中,程序打印 "及格",但没有遇到 break 语句。

  3. 由于没有 break,程序会继续执行下一个 case 分支(case 'D'),打印 "再接再厉"

  4. 同样,case 'D' 也没有 break,程序继续执行 case 'E',打印 "挂科"

package com.kuang.struct;
 
public class switchDemo01 {
    public static void main( String[] args) {
        //case穿透
        char grade = 'c';
        
        switch (grade){
            case 'A':
                System.out.println("优秀");
                break;
            case 'B':
                System.out.println("良好");
            case 'c':
                System.out.println("及格");
            case 'D':
                System.out.println("再接再厉");
            case 'E':
                System.out.println("挂科");
        }
    }
}

如果是A,输出:
优秀

如果是C,输出:(因为没有break,它会接着输出CDE的内容)
及格
再接再厉
挂科

解决case穿透的方法也很简单:加上break

switch (grade) {
    case 'A':
        System.out.println("优秀");
        break;
    case 'B':
        System.out.println("良好");
        break;
    case 'c':
        System.out.println("及格");
        break;
    case 'D':
        System.out.println("再接再厉");
        break;
    case 'E':
        System.out.println("挂科");
        break;
}

-

下面的代码演示了default,即默认值,如果没有选项命中,便会执行default的内容

package com.kuang.struct;
 
public class switchDemo01 {
    public static void main( String[] args) {
        //case穿透 //switch 匹配一个具体的值
        char grade = 'F';
        
        switch (grade){
            case 'A':
                System.out.println("优秀");
                break; //可选
            case 'B':
                System.out.println("良好");
            case 'c':
                System.out.println("及格");
            case 'D':
                System.out.println("再接再厉");
            case 'E':
                System.out.println("挂科");
            default:
                System.out.println("未知等级");
        }
    }
}
未知等级

-

下面的代码演示了switch判断字符串的流程:

从 Java 7 开始,switch 语句支持字符串作为判断条件。其原理基于字符串的 hashCode() 方法和 equals() 方法。

  • hashCode() 方法
    每个字符串都有一个哈希值,通过 hashCode() 方法计算得到。switch 语句首先会计算字符串的哈希值,然后根据哈希值来确定匹配的 case 分支。

  • equals() 方法
    如果有多个 case 分支的字符串哈希值相同(即发生哈希冲突),switch 语句会进一步使用 equals() 方法来比较字符串是否完全相等。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        String name ="狂神";
        //JDK7的新特性,表达式结果可以是字符串! ! !
        //字符的本质还是数字

        //反编译 java---class (字节码文件) ----反编译 (IDEA)
        switch (name){      // 通过hash进行判断
            case "秦疆":
                System.out.println("秦疆");
                break;
            case "狂神":
                System.out.println("狂神");
                break;
            default:
                System.out.println("弄啥呦!");
        }
    }
}

-

-

循环结构

while循环

while 循环的流程可以概括为以下几步:

  1. 条件判断:在循环开始之前,先判断循环条件是否为 true

  2. 执行循环体:如果条件为 true,则执行循环体中的代码。

  3. 重复判断条件:执行完循环体后,再次判断循环条件是否为 true

  4. 循环结束:如果条件为 false,则退出循环,继续执行循环之后的代码。

while(布尔表达式) {
    //循环内容
}

注意事项

  • 只要布尔表达式为true,循环就会一直执行下去。
  • 我们大多数情况是会让循环停止下来的,我们需要一个让表达式失效的方式来结束循环。
  • 少部分情况需要循环一直执行,比如服务器的请求响应监听等
  • 循环条件一直为true就会造成无限循环【死循环】,我们正常的业务编程中应该尽量避免死循环。会影响程序性能或者造成程序卡死奔溃!

-

下面的代码演示了使用while循环遍历5次“Hello world!”,步骤如下:

  1. 初始化变量 i 的值为 0

  2. 判断循环条件 i < 5 是否成立。

    • 如果条件为 true,执行循环体:

      • 打印 "Hello world"。

      • i 的值加1(i++)。

    • 如果条件为 false,退出循环。

  3. 重复步骤2,直到 i 的值不再小于5。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int i = 0;
        while (i < 5){
            System.out.println("Hello world");
            i++;
        }
    }
}
Hello world
Hello world
Hello world
Hello world
Hello world

-

下面的代码演示了:计算1+2+3+...+100=?,步骤如下:

  1. 初始化变量:

    • i = 0:用于控制循环的计数器。

    • sum = 0:用于存储累加的结果。

  2. 进入 while 循环:

    • 判断条件 i <= 100 是否成立。

    • 如果条件为 true,执行循环体:

      • 将当前的 i 值加到 sum 中(sum += i)。

      • i 的值加1(i++)。

    • 如果条件为 false,退出循环。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        //计算1+2+3+...+100=?    

        int i = 0;
        int sum = 0;

        while (i<=100){
            sum += i;
            i++;
        }
        System.out.println(sum);
    }
}

-

do...while循环

对于while语句而言,如果不满足条件,则不能进入循环。但有时候我们需要即使不满足条件,也至少执行一次。

do...while循环和while循环相似,不同的是,do...while循环至少会执行一次。

do {
    //代码语句
}while(布尔表达式);

While和do-While的区别:

  • while先判断后执行。dowhile是先执行后判断!
  • Do...while总是保证循环体会被至少执行一次!这是他们的主要差别。

下面的代码演示了while和do-while循环的区别,可见do-while一定会至少执行一次

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int a = 0;
        while(a < 0){
            System.out.println(a);
            a++;
        }
        System.out.println("================");
        do{
            System.out.println(a);
            a++;
        }while(a<0);
    }
}
================
0

-

for循环

虽然所有循环结构都可以用while或者do... while表示,但Java提供了另一种语句——for循环,使一些循环结构变得更加简单。for循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。

for循环执行的次数是在执行前就确定的。

整体流程:

  1. 最先执行初始化步骤。可以声明一种类型,但可初始化一个或多个循环控制变量,也可以是空语句。
  2. 然后,检测布尔表达式的值。如果为true,循环体被执行。如果为false,循环终止,开始执行循环体后面的语句。
  3. 执行一次循环后,更新循环控制变量(迭代因子控制循环变量的增减)。
  4. 再次检测布尔表达式。循环执行上面的过程。

语法格式如下:

for(初始化语句;布尔表达式;更新语句){
    //代码语句
}

-

下面的两段代码演示了计算0到100之间的奇数和偶数的和,具体步骤如下:

  1. 初始化变量

    • sum1 用于存储偶数之和,初始值为 0

    • sum2 用于存储奇数之和,初始值为 0

  2. 计算偶数之和

    • 使用 for 循环,从 0 开始,步长为 2i += 2),循环条件为 i < 101

    • 每次循环将当前的 i(偶数)加到 sum1 中。

    • 循环结束后,sum1 包含了从 0100 的所有偶数之和。

  3. 计算奇数之和

    • 使用另一个 for 循环,从 1 开始,步长为 2i += 2),循环条件为 i < 101

    • 每次循环将当前的 i(奇数)加到 sum2 中。

    • 循环结束后,sum2 包含了从 1100 的所有奇数之和。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int sum1 = 0, sum2 = 0;
        for (int i = 0; i < 101; i+=2){
            sum1 += i;
        }
        System.out.println(sum1);

        for (int i = 1; i < 101; i+=2){
            sum2 += i;
        }
        System.out.println(sum2);
    }
}

第二段代码如下:

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int sum1 = 0, sum2 = 0;
        for (int i = 0; i < 101; i+=1){
            if (i % 2 == 0)
                sum1 += i;
        }
        System.out.println(sum1);

        for (int i = 1; i < 101; i+=2){
            if (i % 2 == 1)
                sum2 += i;
        }
        System.out.println(sum2);
    }
}

-

这段代码演示了如何用for循环输出1-1000之间能被5整除的数,并且每行输出3个

  • print:输出内容后不换行。

  • println:输出内容后自动换行。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        for (int i = 0, j = 0; i < 1000; i+=1){
            if (i % 5 == 0) {
                System.out.print(i + "\t");     // print输出完不会换行
                j++;
                if (j % 3 == 0) {
                    System.out.println("");   // println输出完会换行
                }
            }
        }

    }
}

-

下面的代码演示了如何使用for循环嵌套打印九九乘法表:

package scanner;

public class demo1 {
    public static void main(String[] args) {
        for (int i = 1; i < 10; i+=1){
            for (int j = 1; j <= i; j+=1){
                System.out.print(i+"*"+j+"="+i*j+"\t");
            }
            System.out.println();
        }
    }
}

-

增强for循环

Java5 引入了一种主要用于数组或集合的增强型for循环。

Java 增强for循环语法格式如下:

  • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
  • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
for(声明语句∶表达式){
  //代码句子
}

下面的代码演示了如何使用for循环遍历数组(超纲内容,会在数组章节详细学习,可先跳过)

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int[] numbers = {10,20,30,40,50};//定义了一个数组

        for (int i = 0;i<5;i++){
            System.out.println(numbers[i]);
        }
        System.out.println("====================");

        // 方法二:遍历数组的元素
        for (int x: numbers){
            System.out.println(x);
        }
    }
}

输出结果 

10
20
30 
40 
50
====================
10
20
30 
40 
50

-

break & continue

break在任何循环语句的主体部分,均可用break控制循环的流程。break用于强行退出循环,不执行循环中剩余的语句。(break语句也在switch语句中使用)

continue语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

-

下面的代码演示了break的使用,一旦触发,终止循环

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int i=0;

        while(i<100){
            i++;
            if (i % 5 == 0){
                break;
            }
            System.out.println(i);
        }

    }
}
1
2
3
4

-

下面的代码演示了continue的使用,一旦触发,跳过本轮循环,进入下一轮循环

package scanner;

public class demo1 {
    public static void main(String[] args) {
        int i=0;

        while(i<10){
            i++;
            if (i % 5 == 0){
                continue;
            }
            System.out.println(i);
        }

    }
}
1
2
3
4
6
7
8
9

-

goto

关于goto关键字

  • goto关键字很早就在程序设计语言中出现。尽管goto仍是Java的一个保留字,但并未在语言中得到正式使用;Java没有goto。然而,在break和continue这两个关键字的身上,我们仍然能看出一些goto的影子---带标签的break和continue。
  • “标签”是指后面跟一个冒号的标识符,例如: label:
  • 对Java来说唯一用到标签的地方是在循环语句之前。而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于break和continue关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。

下面的代码演示了如何使用标签

  • 如果 i % j == 0,说明 i 能被 j 整除,因此 i 不是质数。使用 continue outer; 跳出外层循环,继续检查下一个 i。但标签(如 outer)在 Java 中不推荐使用,因为它会使代码难以阅读和维护。可以使用布尔变量或其他逻辑来替代。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        // 打印100-150之间的质数

        outer: for (int i=101;i<150;i++){       // 不建议使用
            for (int j=2;j<i/2;j++){
                if (i % j == 0){
                    continue outer;
                }
            }
            System.out.println(i+"");
        }

    }
}
101
103
107
109
113
127
131
137
139
149

改进的代码:

  1. 去掉标签:使用布尔变量 isPrime 来标记是否为质数,避免使用标签。

  2. 优化内层循环:将内层循环的条件改为 j * j <= i,减少不必要的计算。

package scanner;

public class demo1 {
    public static void main(String[] args) {
        for (int i = 101; i < 150; i++) {
            boolean isPrime = true;
            for (int j = 2; j * j <= i; j++) {  // 只检查到 sqrt(i)
                if (i % j == 0) {
                    isPrime = false;
                    break;  // 不需要继续检查
                }
            }
            if (isPrime) {
                System.out.println(i);
            }
        }
    }
}

-

练习

打印如下所示的三角形(固定5行)

     *
    ***
   *****
  *******
 *********

答案: 

package scanner;

public class demo1 {
    public static void main(String[] args) {
        //打印三角形 5行

        for (int i = 1; i <= 5; i++) {
            for (int j = 5; j >=i ; j--) {
                System.out.print(" ");
            }
            for (int j = 1; j <=i ; j++) {
                System.out.print("*");
            }
            for (int j = 1; j < i; j++) {
                System.out.print("*");
            }

            System.out.println();
        }

    }
}

然后可以试试设置行数的打印:

答案:

package scanner;

public class demo1 {    
    public static void main(String[] args) {
        int len = 7;
        for (int i = 1; i <= len; i++) {
            for (int i1 = len; i1 >= i; i1--) {
                System.out.print(" ");
            }
            for (int i1 = 0; i1 < 2 * i - 1; i1++) {
                System.out.print("*");
            }
            System.out.println();
        }

    }
}

-

-

🎉 感谢您的支持! 🎉

如果您觉得我的内容有价值,或者对您有所帮助,希望您能给我一个小小的鼓励:

  • 👍 点赞:让我知道您喜欢我的内容!

  • 👀 关注:第一时间获取更多有趣、有用的信息!

  • ⭐️ 收藏:方便您随时回顾,也方便分享给更多需要的人!

您的支持是我不断进步的动力!感谢您抽出宝贵的时间阅读,祝您生活愉快,万事顺心!✨

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2300390.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

后端生成二维码,前端请求接口生成二维码并展示,且多个参数后边的参数没有正常传输问题处理

一、后端代码 1、controller GetMapping("/generateQRCode/{url}")ApiOperation(value "生成url链接二维码",notes "生成url链接二维码")public JsonResult<NewsQRCodeVo> generateQRCode(PathVariable String url,HttpServletRespons…

(8/100)每日小游戏平台系列

项目地址位于&#xff1a;小游戏导航 新增一个打地鼠游戏&#xff01; 打地鼠&#xff08;Whack-a-Mole&#xff09;是一款经典的休闲游戏&#xff0c;玩家需要点击随机出现的地鼠&#xff0c;以获取分数。游戏时间有限&#xff0c;玩家需要在规定时间内尽可能多地击中地鼠&am…

[Python人工智能] 五十.PyTorch入门 (5)快速搭建神经网络及模型保存

从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前文讲解PyTorch构建分类神经网络。这篇文章将介绍如何利用PyTorch快速构建神经网络,之前的代码比较复杂,通过自定义Net类实现,本文通过Torch函数定义神经网络。前面我们的Python人工智能主要以Tens…

SpringBoot+Vue+数据可视化的动漫妆造服务平台(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在当今数字化高速发展的时代&#xff0c;动漫产业迎来了前所未有的繁荣&#xff0c;动漫…

基于web的留守儿童网站的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

OpenCV中的边缘检测

边缘检测是图像处理和计算机视觉中的关键技术之一&#xff0c;旨在识别图像中像素强度发生显著变化的区域&#xff0c;这些区域通常对应于物体的边界或轮廓。边缘检测在机器视觉中具有重要的需求背景&#xff0c;主要体现在以下几个方面&#xff1a; 图像分割&#xff1a;边缘…

家里WiFi信号穿墙后信号太差怎么处理?

一、首先在调制解调器&#xff08;俗称&#xff1a;猫&#xff09;测试网速&#xff0c;网速达不到联系运营商&#xff1b; 二、网线影响不大&#xff0c;5类网线跑500M完全没问题&#xff1b; 三、可以在卧室增加辅助路由器&#xff08;例如小米AX系列&#xff09;90~200元区…

【前端学习笔记】Webpack

1.介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具&#xff0c;它将 JavaScript、CSS、图片、字体等资源文件打包成一个或多个静态文件&#xff0c;以供浏览器使用。当 webpack 处理应用程序时&#xff0c;它会在内部从一个或多个入口点构建一个 依赖图(depend…

数据结构(陈越,何钦铭)第三讲 树(上)

3.1 树与数的表示 3.1.1 顺序查找 int SequentialSearch(List Tbl,ElementType K){int i;Tbl->Element[0]K;for(iTbl->Length;Tbl->Element[i]!K;i--);return i; } typedef struct LNode *List; struct LNode{ElementType Element[MAXSIZE];int Length; };3.1.2 二分…

【深度解析】图解Deepseek-V3模型架构-混合专家模型(MoE)

一、引言 最近非常火爆的DeepSeek-V3模型&#xff0c;是一个包含6710亿总参数的强大混合专家模型&#xff08;MoE&#xff09;&#xff0c;其中每个token激活370亿参数。该模型在DeepSeek-V2验证有效的核心架构基础上&#xff0c;采用多头潜在注意力&#xff08;MLA&#xff0…

c#判断exe文件是不是7z或者rar的自解压文件

亲测可以实现检测7z的自解压&#xff0c;但是对于rar的自解压格式&#xff0c;最新版不支持&#xff0c;尝试修改回发现几乎检测成了exe文件&#xff0c;这显然是不正确的&#xff0c;其他版本未测试。 如下图所示&#xff0c;可以检测出自解压格式的7z文件&#xff0c;黑色显…

富士SC2022,C325,C328打印机扫描到网络详细教程

前言&#xff1a; 在开始教程之前,我先声明目前该教程适用于FujiXerox apeos C325Z和FujiXerox DocuCentre SC2022打印机。这次教程以FujiXerox DocuCentre SC2022为例&#xff0c;该打印机IP地址为10.40.11.240。 前提条件 &#xff1a; 1. 安装打印机所需打印机和扫…

人工智能3d点云之Pointnet++项目实战源码解读(点云分类与分割)

一.项目文件概述 二.数据读取模块配置 实际代码运行时是先定义与加载好模型&#xff0c;然后再去读取数据进来传入到模型网络中去训练。但现在反过来先读取数据开始。 进入ModelNetDataLoader类的_getitem方法, 做标准化的目的是处理异常大的数值 上面返回的cls是类别,相当于…

IP 路由基础 | 路由条目生成 / 路由表内信息获取

注&#xff1a;本文为 “IP 路由” 相关文章合辑。 未整理去重。 IP 路由基础 秦同学学学已于 2022-04-09 18:44:20 修改 一. IP 路由产生背景 我们都知道 IP 地址可以标识网络中的一个节点&#xff0c;并且每个 IP 地址都有自己的网段&#xff0c;各个网段并不相同&#xf…

java后端开发day16--字符串(二)

&#xff08;以下内容全部来自上述课程&#xff09; 1.StringBuilder 因为StringBuilder是Java已经写好的类。 java在底层对他进行了一些特殊处理。 打印对象不是地址值而是属性值。 1.概述 StringBuilder可以看成是一个容器&#xff0c;创建之后里面的内容是可变的。 作用…

LabVIEW危化品仓库的安全监测系统

本案例展示了基于LabVIEW平台设计的危化品仓库安全监测系统&#xff0c;结合ZigBee无线通信技术、485串口通讯技术和传感器技术&#xff0c;实现了对危化品仓库的实时无线监测。该系统不仅能提高安全性&#xff0c;还能大幅提升工作效率&#xff0c;确保危化品仓库的安全运营。…

深度学习框架探秘|Keras 应用案例解析以及 Keras vs TensorFlow vs PyTorch

引言 上一篇文章《深度学习框架探秘&#xff5c;Keras&#xff1a;深度学习的魔法钥匙》 我们初步学习了 Keras&#xff0c;包括它是什么、具备哪些优势&#xff08;简洁易用的 API、强大的兼容性、广泛的应用领域&#xff09;&#xff0c;以及基本使用方法。本文&#xff0c;…

NAT(网络地址转换)技术详解:网络安全渗透测试中的关键应用与防御策略

目录 NAT的作用 NAT类型 NAT工作流程示例 NAT 转换技术的原理 源地址转换&#xff08;SNAT&#xff0c;Source NAT&#xff09;&#xff1a; 目标地址转换&#xff08;DNAT&#xff0c;Destination NAT&#xff09;&#xff1a; 端口地址转换&#xff08;PAT&#xff0c…

容器化部署Kafka的最佳实践:基于KRaft模式的无ZooKeeper方案

一、docker 部署kafka单节点 1.1安装docker 可以参考这篇CentOS 7安装docker并配置镜像加速 1.3 运行kafka&#xff08;注意修改zookeeper&#xff0c;kafka地址&#xff09; docker run -d --name kafka -e KAFKA_ADVERTISED_LISTENERSPLAINTEXT://172.16.10.180:9092 -p …

【PHP】php+mysql 活动信息管理系统(源码+论文+数据库+数据库文件)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【PHP】php 活动信息管理系统&#xff08;源码论文…