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();}}
}

-

-

🎉 感谢您的支持! 🎉

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

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

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

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Boot 原理分析

spring-boot.version&#xff1a;2.4.3.RELEASE Spring Boot 依赖管理 spring-boot-starter-parent 配置文件管理 <resources> <resource> <directory>${basedir}/src/main/resources</directory> <filtering>true&l…

Word中接入大模型教程

前言 为什么要在word中接入大模型呢&#xff1f; 个人觉得最大的意义就是不用来回切换与复制粘贴了吧。 今天分享一下昨天实践的在word中接入大模型的教程。 在word中接入大模型最简单的方式就是使用vba。 vba代码要做的事&#xff0c;拆分一下就是&#xff1a; 获取用户…

【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能

前言 vue-element-admin-plus对于复杂业务的支持程度确实不怎么样&#xff0c;我这里就遇到了编辑页面中还要嵌套列表的真实案例&#xff0c;比如字典&#xff0c;主字典嵌套子信息&#xff0c;类似于一个树状结构。目前vue-element-admin-plus给出的例子是无法满足这个需求的…

OpenCV中的边缘检测

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

vscode的一些实用操作

1. 焦点切换(比如主要用到使用快捷键在编辑区和终端区进行切换操作) 2. 跳转行号 使用ctrl g,然后输入指定的文件内容&#xff0c;即可跳转到相应位置。 使用ctrl p,然后输入指定的行号&#xff0c;回车即可跳转到相应行号位置。

Redis(高阶篇)02章——BigKey

一、面试题 阿里广告平台&#xff0c;海量数据里查询某一个固定前缀的key小红书&#xff0c;你如何生产上限制 keys* /flushdb/flushall等危险命令以防止阻塞或误删数据&#xff1f;美团&#xff0c;memory usage命令你用过吗&#xff1f;BigKey问题&#xff0c;多大算big&…

《Zookeeper 分布式过程协同技术详解》读书笔记-2

目录 zk的一些内部原理和应用请求&#xff0c;事务和标识读写操作事务标识&#xff08;zxid&#xff09; 群首选举Zab协议&#xff08;ZooKeeper Atomic Broadcast protocol&#xff09;文件系统和监听通知机制分布式配置中心, 简单Demojava code 集群管理code 分布式锁 zk的一…

53倍性能提升!TiDB 全局索引如何优化分区表查询?

作者&#xff1a; Defined2014 原文来源&#xff1a; https://tidb.net/blog/7077577f 什么是 TiDB 全局索引 在 TiDB 中&#xff0c;全局索引是一种定义在分区表上的索引类型&#xff0c;它允许索引分区与表分区之间建立一对多的映射关系&#xff0c;即一个索引分区可以对…

unity学习39:连续动作之间的切换,用按键控制角色的移动

目录 1 不同状态之间的切换模式 1.1 在1个连续状态和一个连续状态之间的transition&#xff0c;使用trigger 1.2 在2个连续状态之间的转换&#xff0c;使用bool值切换转换 2 至少现在有2种角色的移动控制方式 2.1 用CharacterController 控制角色的移动 2.2 用animator…

【Python 打造高效文件分类工具】

【Python】 打造高效文件分类工具 一、代码整体结构二、关键代码解析&#xff08;一&#xff09;初始化部分&#xff08;二&#xff09;界面创建部分&#xff08;三&#xff09;核心功能部分&#xff08;四&#xff09;其他辅助功能部分 三、运行与使用四、示图五、作者有话说 …

网络工程师 (43)IP数据报

前言 IP数据报是互联网传输控制协议&#xff08;Internet Protocol&#xff0c;IP&#xff09;的数据报格式&#xff0c;由首部和数据两部分组成。 一、首部 IP数据报的首部是控制部分&#xff0c;包含了数据报传输和处理所需的各种信息。首部可以分为固定部分和可变部分。 固定…

Leetcode 424-替换后的最长重复字符

给你一个字符串 s 和一个整数 k 。你可以选择字符串中的任一字符&#xff0c;并将其更改为任何其他大写英文字符。该操作最多可执行 k 次。 在执行上述操作后&#xff0c;返回 包含相同字母的最长子字符串的长度。 题解 可以先做LCR 167/Leetcode 03再做本题 滑动窗口&…

28 在可以控制 postgres 服务器, 不知道任何用户名的情况下怎 进入 postgres 服务器

前言 最近有这样的一个需求, 有一个 postgres 服务器 但是 不知道 他的任何的用户名密码, 但是我想要查询这台 postgres 服务器 然后 基于这个需求, 我们看一下 怎么来处理 pg_hba.conf 认证方式修改为 trust 首先将 postgres 服务器的认证方式修改为 trust 这时候 …

LM Studio笔记

一、什么是 LM Studio&#xff1f; LM Studio 是一款功能强大、易于使用的桌面应用程序&#xff0c;用于在本地机器上实验和评估大型语言模型&#xff08;LLMs&#xff09;。它允许用户轻松地比较不同的模型&#xff0c;并支持使用 NVIDIA/AMD GPU 加速计算。 功能集&#xff1…

内网下,Ubuntu (24.10) 离线安装docker最新版教程

一般在数据比较敏感的情况下&#xff0c;是无法使用网络的&#xff0c;而对于Ubuntu系统来说&#xff0c;怎么离线安装docker呢&#xff1f; 下面我给大家来讲一下&#xff1a; 采用二进制安装&#xff1a; 1.下载docker离线包 官网下载&#xff1a; Index of linux/static…

框架ThinkPHP(小迪网络安全笔记~

免责声明&#xff1a;本文章仅用于交流学习&#xff0c;因文章内容而产生的任何违法&未授权行为&#xff0c;与文章作者无关&#xff01;&#xff01;&#xff01; 附&#xff1a;完整笔记目录~ ps&#xff1a;本人小白&#xff0c;笔记均在个人理解基础上整理&#xff0c;…

sql数据执行失败,三个命令依次执行

set global innodb_strict_mode off set global.sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION; set sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION;

【网络安全】零基础入门网络安全劝退指北

作为从16年接触网络安全的小白&#xff0c;谈谈零基础如何入门网络安全&#xff0c;有不对的地方&#xff0c;请多多指教。 这些年最后悔的事情莫过于没有把自己学习的东西积累下来形成一个知识体系。 如何入门 简单了解网络安全 网络安全就是指的确保网络系统中的数据不被别…

【Linux】网络基础

目录 一、协议分层 &#xff08;一&#xff09;计算机网络 &#xff08;二&#xff09;协议分层 &#xff08;三&#xff09;OSI模型 &#xff08;四&#xff09;TCP/IP协议 二、网络传输过程 三、IP地址和MAC地址 &#xff08;一&#xff09;IP地址 &#xff08;二&a…

ms-swift3 序列分类训练

目录 引言 一、数据集准备 二、训练/推理代码 2.1 训练 2.2 推理 三、性能验证 引言 swift 3.x支持了序列分类Command Line Parameters — swift 3.2.0.dev0 documentation 想尝试一下用多模态&#xff08;图像&#xff09;的序列分类与普通的图像分类任务有啥区别 一、…