当前位置: 首页 > news >正文

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

 前言

本笔记是学习狂神的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();}}
}

-

-

🎉 感谢您的支持! 🎉

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

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

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

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

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

相关文章:

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

前言 本笔记是学习狂神的java教程&#xff0c;建议配合视频&#xff0c;学习体验更佳。 【狂神说Java】Java零基础学习视频通俗易懂_哔哩哔哩_bilibili Scanner对象 之前我们学的基本语法中我们并没有实现程序和人的交互&#xff0c;但是Java给我们提供了这样一个工具类&…...

鸡兔同笼问题

鸡兔同笼问题是这样一个问题&#xff1a; 现有鸡、兔合装在一个笼子里。数头一共100个头&#xff0c;数脚一共300只脚。问有多少只鸡多少只兔&#xff1f; 在这里讨论这个问题的解法当然太小儿科了。但是y_tab这个C语言解释器只提供了1维数组。如果需要用到2维数组时&#xff…...

【Pytorch 库】自定义数据集相关的类

torch.utils.data.Dataset 类torch.utils.data.DataLoader 类自定义数据集示例1. 自定义 Dataset 类2. 在其他 .py 文件中引用和使用该自定义 Dataset torch_geometric.data.Dataset 类torch_geometric.data.Dataset VS torch.utils.data.Dataset 详细信息&#xff0c;参阅 tor…...

electron打包基本教程

从0开始搭建 概要步骤基础软件运行项目打包项目 注意事项 概要 将html打包成桌面的主流有electron和nwjs&#xff0c;nwjs更加简单&#xff0c;但是使用效果不如electron&#xff0c;electron打包比较麻烦&#xff0c;但是效果比较好&#xff0c;反正各有优势和缺点 步骤 基…...

实现pytorch注意力机制-one demo

主要组成部分&#xff1a; 1. 定义注意力层&#xff1a; 定义一个Attention_Layer类&#xff0c;接受两个参数&#xff1a;hidden_dim&#xff08;隐藏层维度&#xff09;和is_bi_rnn&#xff08;是否是双向RNN&#xff09;。 2. 定义前向传播&#xff1a; 定义了注意力层的…...

深入Flask:如何优雅地处理HTTP请求与响应

哈喽,大家好,我是木头左! 本文将带你深入了解如何在Flask中优雅地处理HTTP请求和响应,让你的应用更加高效、安全和用户友好。 创建一个简单的Flask应用 让从创建一个最简单的Flask应用开始: from flask import Flaskapp = Flask(__name__)@app.route(/) def...

JVM ②-双亲委派模型 || 垃圾回收GC

这里是Themberfue 在上节课对内存区域划分以及类加载的过程有了简单的了解后&#xff0c;我们再了解其他两个较为重要的机制&#xff0c;这些都是面试中常考的知识点&#xff0c;有必要的话建议背出来&#xff0c;当然不是死记硬背&#xff0c;而是要有理解的背~~~如果对 JVM …...

jQuery介绍(快速、简洁JavaScript库,诞生于2006年,主要目标是简化HTML文档操作、事件处理、动画和Ajax交互)

文章目录 **核心功能 & 亮点**1. **简化 DOM 操作**2. **链式调用**3. **跨浏览器兼容**4. **便捷的事件绑定**5. **Ajax 封装**6. **动画效果** **现状与适用场景**- **传统项目维护**&#xff1a;许多旧系统&#xff08;如 WordPress 插件、老企业网站&#xff09;仍依赖…...

python旅游推荐系统+爬虫+可视化(协同过滤算法)

✅️基于用户的协同过滤算法 ✅️有后台管理 ✅️2w多数据集 这个旅游数据分析推荐系统采用了Python语言、Django框架、MySQL数据库、requests库进行网络爬虫开发、机器学习中的协同过滤算法、ECharts数据可视化技术&#xff0c;以实现从网站抓取旅游数据、个性化推荐和直观展…...

Ubuntu 22.04.5 LTS 安装企业微信,(2025-02-17安装可行)

一、依赖包(Ubuntu 20.04/Debian 11) 点击下载https://www.spark-app.store/download_dependencies_latest 1、 下载最新的依赖包。 请访问星火应用商店依赖包下载页面, 下载最新的依赖包。2、解压依赖包 </...

【Excel笔记_6】条件格式和自定义格式设置表中数值超过100保留1位,超过1000保留0位,低于100为默认

方法一&#xff1a;自定义格式 选中需要设置格式的单元格区域。右键选择设置单元格格式&#xff0c;或者在工具栏中选择开始 -> 数字 -> 自定义格式。在类型框中输入以下自定义格式&#xff1a; [>1000]0;[>100]0.0;G/通用格式解释&#xff1a; [>1000]0&…...

UDP与TCP

用UDP一定比用TCP快吗&#xff1f; 假设我们需要在a电脑的进程发一段数据到b电脑的进程我们可以选择使用TCP或UDP协议进行通信。 对于TCP这样的可靠性协议每次消息发出后都能明确知道对方有没有收到&#xff0c;就像打电话一样&#xff0c;只要“喂喂"两下对方就能回你个…...

Web开发技术概述

Web开发技术涵盖了前端和后端开发&#xff0c;以及数据库技术。前端开发包括使用HTML、CSS、JavaScript等原生技术&#xff0c;以及jQuery、Bootstrap、AngularJS、React、Vue等框架。后端开发则涉及ASP.NET、PHP、Python Web&#xff08;Flask、Django&#xff09;、Java Web&…...

解压rar格式的软件有哪些?8种方法(Win/Mac/手机/网页端)

RAR 文件是一种常见的压缩文件格式&#xff0c;由尤金・罗谢尔&#xff08;Eugene Roshal&#xff09;开发&#xff0c;因其扩展名 “rar” 而得名。它通过特定算法将一个或多个文件、文件夹进行压缩&#xff0c;大幅减小存储空间&#xff0c;方便数据传输与备份。然而&#xf…...

uniapp开发:首次进入 App 弹出隐私协议窗口

前言&#xff1a;在移动应用开发中&#xff0c;隐私协议弹窗是一个非常重要的功能。它不仅符合法律法规的要求&#xff08;如 GDPR、CCPA 等&#xff09;&#xff0c;还能增强用户对 App 的信任感。本文将介绍如何在 Uniapp 开发的 App 中实现“首次进入弹出隐私协议窗口&#…...

执行pnpm run dev报错:node:events:491 throw er; // Unhandled ‘error‘ event的解决方案

vite搭建的vue项目&#xff0c;使用pnpm包管理工具&#xff0c;执行pnpm run dev&#xff0c;报如下错误&#xff1a; 报错原因&#xff1a; pnpm依赖安装不完整&#xff0c;缺少esbuild.exe文件&#xff0c;导致无法执行启动命令。 解决方案&#xff1a; 根据错误提示中提到…...

OpenCV机器学习(4)k-近邻算法(k-Nearest Neighbors, KNN)cv::ml::KNearest类

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::ml::KNearest 是 OpenCV 机器学习模块中的一部分&#xff0c;它提供了实现 k-近邻算法&#xff08;k-Nearest Neighbors, KNN&#xff09;的…...

JVM中的线程池详解:原理→实践

一、为什么需要线程池&#xff1f; 在多线程编程中&#xff0c;频繁地创建和销毁线程会带来显著的性能开销。 想象一下&#xff0c;如果你经营一家西餐厅&#xff0c;每次有顾客到来你都雇佣新的服务员&#xff0c;顾客吃完结账后就解雇——这种模式是不是非常效率低下且成本高…...

SNARKs 和 UTXO链的未来

1. 引言 SNARKs 经常被视为“解决”扩容问题的灵丹妙药。虽然 SNARKs 可以提供令人难以置信的好处&#xff0c;但也需要承认其局限性——SNARKs 无法解决区块链目前面临的现有带宽限制。 本文旨在通过对 SNARKs 对比特币能做什么和不能做什么进行&#xff08;相对&#xff09…...

JavaScript设计模式 -- 外观模式

在实际开发中&#xff0c;往往会遇到多个子系统协同工作时&#xff0c;直接操作各个子系统不仅接口繁琐&#xff0c;还容易导致客户端与内部实现紧密耦合。**外观模式&#xff08;Facade Pattern&#xff09;**通过为多个子系统提供一个统一的高层接口&#xff0c;将复杂性隐藏…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)

骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术&#xff0c;它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton)&#xff1a;由层级结构的骨头组成&#xff0c;类似于人体骨骼蒙皮 (Mesh Skinning)&#xff1a;将模型网格顶点绑定到骨骼上&#xff0c;使骨骼移动…...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

第八部分:阶段项目 6:构建 React 前端应用

现在&#xff0c;是时候将你学到的 React 基础知识付诸实践&#xff0c;构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段&#xff0c;你可以先使用模拟数据&#xff0c;或者如果你的后端 API&#xff08;阶段项目 5&#xff09;已经搭建好&#xff0c;可以直接连…...

Unity VR/MR开发-VR开发与传统3D开发的差异

视频讲解链接&#xff1a;【XR马斯维】VR/MR开发与传统3D开发的差异【UnityVR/MR开发教程--入门】_哔哩哔哩_bilibili...