Java流程控制语句_java if else销量统计,记得把每一次面试当做经验积累英语-程序员宅基地

技术标签: 2024年程序员学习  面试  java  开发语言  

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

语句块n+1;
break;
}

其中,switch、case、default、break 都是 Java 的关键字。

1)switch

表示“开关”,这个开关就是 switch 关键字后面小括号里的值,小括号里要放一个整型变量或字符型变量。表达式必须为 byte,short,int,char类型。

Java7 增强了 switch 语句的功能,允许 switch 语句的控制表达式是 java.lang.String 类型的变量或表达式。只能是 java.lang.String 类型,不能是 StringBuffer 或 StringBuilder 这两种字符串的类型。

2)case

表示“情况,情形”,case 标签可以是:

  • 类型为 char、byte、 short 或 int 的常量表达式。
  • 枚举常量。
  • 从 Java SE 7 开始, case 标签还可以是字符串字面量。

例如:

String input = …;
switch (input.toLowerCase()) { // toLowerCase用于将大写字符转换为小写
case “yes”:

break;
}

当在 switch 语句中使用枚举常量时,不必在每个标签中指明枚举名,可以由 switch 的表达式值确定。例如:

Size sz = …;
switch (sz) {
case SMALL: // no need to use Size.SMALL

break;

}

注意:重复的 case 值是不允许的。

3)default

表示“默认”,即其他情况都不满足。default 后要紧跟冒号,default 块和 case 块的先后顺序可以变动,不会影响程序执行结果。通常,default 块放在末尾,也可以省略不写。

4)break

表示“停止”,即跳出当前结构。

如果在 case 分支语句的末尾没有 break 语句,有可能触发多个 case 分支。那么就会接着执行下一个 case 分支语句。这种情况相当危险,常常会引发错误。为此,我们在程序中从不使用 switch 语句。

如果你喜欢 switch 语句,编译代码时可以考虑加上 -Xlint:fallthrough 选项,如下所示:

javac -Xlint:fallthrough Test.java

这样一来,如果某个分支最后缺少一个 break 语句,编译器就会给出一个警告消息。

switch 语句的执行过程如下:表达式的值与每个 case 语句中的常量作比较。如果发现了一个与之相匹配的,则执行该 case 语句后的代码。如果没有一个 case 常量与表达式的值相匹配,则执行 default 语句。当然,default 语句是可选的。如果没有相匹配的 case 语句,也没有 default 语句,则什么也不执行。

switch语句执行流程图

图 1 switch语句执行流程图

例 1

在节目的抽奖环节里,节目组会根据每位嘉宾的座位号来进行抽奖游戏,根据不同的号码来决定奖项的大小。使用 switch 语句编写 Java 程序来完成奖项分配,其实现代码如下。

public static void main(String[] args) {
System.out.println(“请输入座位号码:”);
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
switch (num) {
case 8:
System.out.println(“恭喜你,获得了三等奖!”);
break;
case 88:
System.out.println(“恭喜你,获得了二等奖!”);
break;
case 888:
System.out.println(“恭喜你,获得了一等奖!”);
break;
default:
System.out.println(“谢谢参与!”);
break;
}
}

当用户输入的号码为 888 时,获取的 num 值为 888,则与第三个 case 后的值匹配,执行它后面的语句,输出“恭喜你,获得了一等奖!”,然后执行 break 语句,跳出整个 switch 结构。如果输入的号码与 case 中的值都不匹配,则执行 default 后的语句。

程序执行结果如下所示:

请输入座位号码:
888
恭喜你,获得了一等奖!
请输入座位号码:
88
恭喜你,获得了二等奖!
请输入座位号码:
66
谢谢参与!

例 2

编写一个 Java 程序,根据当前的星期数字输出对应的汉字。在这里使用包含 break 的 switch 语句来判断当前的星期,实现代码如下:

public static void main(String[] args) {
String weekDate = “”;
Calendar calendar = Calendar.getInstance(); // 获取当前时间
int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 获取星期的第几日
switch (week) {
case 0:
weekDate = “星期日”;
break;
case 1:
weekDate = “星期一”;
break;
case 2:
weekDate = “星期二”;
break;
case 3:
weekDate = “星期三”;
break;
case 4:
weekDate = “星期四”;
break;
case 5:
weekDate = “星期五”;
break;
case 6:
weekDate = “星期六”;
break;
}
System.out.println("今天是 " + weekDate);
}

本程序首先获取当前的星期值,然后使用 switch 语句判断 week 的值:0 表示星期日,1 表示星期一,2 表示星期二……以此类推,6 表示星期六。只要 week 值与 case 值相符合,则程序将执行该 case 中的语句,并跳出 switch 语句,输出结果。

运行程序,输出的结果如下:

今天是星期五

嵌套 switch 语句

可以将一个 switch 语句作为一个外部 switch 语句的语句序列的一部分,这称为嵌套 switch 语句。因为一个 switch 语句定义了自己的块,外部 switch 语句和内部 switch 语句的 case 常量不会产生冲突。例如,下面的程序段是完全正确的:

public static void main(String[] args) {
switch (count) {
case 1:
switch (target) {
case 0:
System.out.println(“target is zero”);
break;
case 1:
System.out.println(“target is one”);
break;
}
break;
case 2: // …
}
}

本例中,内部 switch 语句中的case 1:语句与外部 switch 语句中的case 1:语句不冲突。变量 count 仅与外层的 case 语句相比较。如果变量 count 为 1,则变量 target 与内层的 case 语句相比较。

学到这里我们可以发现以下几点:

  • switch 语句不同于 if 语句的是 switch 语句仅能测试相等的情况,而 if 语句可计算任何类型的布尔表达式。也就是 switch 语句只能寻找 case 常量间某个值与表达式的值相匹配。
  • 在同一个 switch 语句中没有两个相同的 case 常量。当然,外部 switch 语句中的 case 常量可以和内部 switch 语句中的 case 常量相同。
  • switch 语句通常比一系列嵌套 if 语句更有效。

最后一点尤其有趣,因为它使我们知道 Java 编译器如何工作。当编译一个 switch 语句时,Java 编译器将检查每个 case 常量并且创造一个“跳转表”,这个表将用来在表达式值的基础上选择执行路径。因此,如果你需要在一组值中做出选择,switch 语句将比与之等效的 if-else 语句快得多。

编译器可以这样做是因为它知道 case 常量都是同类型的,所要做的只是将它与 switch 表达式相比较看是否相等。对于一系列的 if 表达式,编译器就无此功能。

if 语句和 switch 语句的区别

if 和 switch 语句都表示条件语句,可以从使用效率和实用性两方面加以区分。

1. 从使用效率上区分

从使用效率上区分,在对同一个变量的不同值作条件判断时,既可以使用 switch 语句,也可以使用 if 语句。使用 switch 语句的效率更高一些,尤其是判断的分支越多,越明显。

2. 从实用性上区分

从语句的实用性角度区分,switch 语句不如 if 条件语句,if 语句是应用最广泛和最实用的语句。

3. 何时使用 if 语句和 switch 语句

在程序开发的过程中,何时使用 if 语句和 switch 语句,需要根据实际情况而定,应尽量做到物尽其用。不能因为 switch 语句的效率高就一直使用,也不能因为 if 语句常用就不用 switch 语句。需要根据实际情况,具体问题具体分析,使用最适合的条件语句。

一般情况下,对于判断条件较少的,可以使用 if 条件语句,但是在实现一些多条件的判断中,最好使用 switch 语句。

Java while和do while循环详解

循环是程序中的重要流程结构之一。循环语句能够使程序代码重复执行,适用于需要重复一段代码直到满足特定条件为止的情况。

所有流行的编程语言中都有循环语句。Java 中采用的循环语句与C语言中的循环语句相似,主要有 while、do-while 和 for。另外 Java 5 之后推出了 for-each 循环语句,for-each 循环是 for 循环的变形,它是专门为集合遍历而设计的。for-each 并不是一个关键字。

循环语句可以在满足循环条件的情况下,反复执行某一段代码,这段被重复执行的代码被称为循环体。当反复执行这个循环体时,需要在合适的时候把循环条件改为假,从而结束循环,否则循环将一直执行下去,形成死循环。

循环语句可能包含如下 4 个部分。

  • 初始化语句(init statement): 一条或多条语句,这些语句用于完成一些初始化工作,初始化语句在循环开始之前执行。
  • 循环条件(test_expression):这是一个 boolean 表达式,这个表达式能决定是否执行循环体。
  • 循环体(body_statement):这个部分是循环的主体,如果循环条件允许,这个代码块将被重复执行。如果这个代码块只有一行语句,则这个代码块的花括号是可以省略的。
  • 迭代语句(iteration_statement):这个部分在一次循环体执行结束后,对循环条件求值之前执行,通常用于控制循环条件中的变量,使得循环在合适的时候结束。

上面 4 个部分只是一般性的分类,并不是每个循环中都非常清晰地分出了这 4 个部分。

由于篇幅有限,本文主要介绍 while 和 do-while。关于 for 循环,大家可以参考《Java for语句详解》一节。

while 语句

while 语句是 Java 最基本的循环语句,是一种先判断的循环结构,可以在一定条件下重复执行一段代码。该语句需要判断一个测试条件,如果该条件为真,则执行循环语句(循环语句可以是一条或多条),否则跳出循环。

while 循环语句的语法结构如下:

while(条件表达式) {
语句块;
}

其中语句块中的代码可以是一条或者多条语句,而条件表达式是一个有效的 boolean 表达式,它决定了是否执行循环体。当条件表达式的值为 true 时,就执行大括号中的语句块。

执行完毕,再次检查表达式是否为 true,如果还为 true,则再次执行大括号中的代码,否则就跳出循环,执行 while 循环之后的代码。图 1 表示了 while 循环语句的执行流程。

img

图 1 while 循环语句执行流程图

例 1

使用 while 语句计算 10 的阶乘,其具体代码如下所示。

public static void main(String[] args) {
int i = 1;
int n = 1;
while(i <= 10) {
n=n*i;
i++;
}
System.out.println(“10的阶乘结果为:”+n);
}

在上述代码中,定义了两个变量 i 和 n,循环每执行一次 i 值就加 1,判断 i 的值是否小于等于 10,并利用 n=n*i 语句来实现阶乘。当 i 的值大于 10 之后,循环便不再执行并退出循环。

运行程序,执行的结果如下所示:

10 的阶乘结果为:3628800

do-while 语句

如你刚才所见,如果 while 循环一开始条件表达式就是假的,那么循环体就根本不被执行。然而,有时需要在开始时条件表达式即使是假的情况下,while 循环至少也要执行一次。换句话说,有时你需要在一次循环结束后再测试中止表达式,而不是在循环开始时。

幸运的是,Java就提供了这样的循环:do-while循环。do-while 循环语句也是 Java 中运用广泛的循环语句,它由循环条件和循环体组成,但它与 while 语句略有不同。do-while 循环语句的特点是先执行循环体,然后判断循环条件是否成立。

do-while 语句的语法格式如下:

do {
语句块;
}while(条件表达式);

以上语句的执行过程是,首先执行一次循环操作,然后再判断 while 后面的条件表达式是否为 true,如果循环条件满足,循环继续执行,否则退出循环。while 语句后必须以分号表示循环结束,其运行流程如图 2 所示。

img

图 2 do-while 循环语句的执行流程

例 2

编写一个程序,计算 10 的阶乘。使用 do-while 循环的实现代码如下所示。

public static void main(String[] args) {
int number = 1,result = 1;
do {
result*=number;
number++;
}while(number <= 10);
System.out.print(“10阶乘结果是:”+result);
}

程序运行后输出结果如下:

10 阶乘结果是:3628800

例 3

在一个图书系统的推荐图书列表中保存了 50 条信息,现在需要让它每行显示 10 条,分 5 行进行显示。下面使用 do-while 循环语句来实现这个效果,其具体代码如下所示。

public static void main(String[] args) {
int bookIndex = 1;
do {
System.out.print(bookIndex+“\t”);
if(bookIndex%10 == 0) {
System.out.println();
}
bookIndex++;
}while(bookIndex<51);
}

在上述代码中, 声明一个变量 bookIndex 用来保存图书的索引,该变量赋值为 1 表示从第一本开始。在 do-while 循环体内,首先输出了 bookIndex 的值,然后判断 bookIndex 是否能被 10 整除,如果可以则说明当前行已经输出 10 条,用 System.out.println() 语句输出了一个换行符。之后使 bookIndex 加 1,相当于更新当前的索引。最后在 while 表达式中判断是否超出循环的范围,即 50 条以内。

运行程序,执行的结果如下所示。

1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20
21 22 23 24 25 26 27 28 29 30
31 32 33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48 49 50

while和do-while的比较

while 循环和 do-while 循环的相同处是:都是循环结构,使用 while(循环条件) 表示循环条件,使用大括号将循环操作括起来。

while 循环和 do-while 循环的不同处如下:

  • 语法不同:与 while 循环相比,do-while 循环将 while 关键字和循环条件放在后面,而且前面多了 do 关键字,后面多了一个分号。
  • 执行次序不同:while 循环先判断,再执行。do-while 循环先执行,再判断。
  • 一开始循环条件就不满足的情况下,while 循环一次都不会执行,do-while 循环则不管什么情况下都至少执行一次。

Java for循环详解

for 语句是应用最广泛、功能最强的一种循环语句。大部分情况下,for 循环可以代替 while 循环、do while 循环。

for 语句是一种在程序执行前就要先判断条件表达式是否为真的循环语句。假如条件表达式的结果为假,那么它的循环语句根本不会执行。for 语句通常使用在知道循环次数的循环中。

for 语句语法格式如下所示。

for(条件表达式1;条件表达式2;条件表达式3) {
语句块;
}

for 循环中 3 个条件表达式的含义如表 1 所示。

表达式 形式 功能 举例
条件表达式 1 赋值语句 循环结构的初始部分,为循环变量赋初值 int i=1
条件表达式 2 条件语句 循环结构的循环条件 i>40
条件表达式 3 迭代语句,通常使用 ++ 或 – 运算符 循环结构的迭代部分,通常用来修改循环 变量的值 i++

for 关键字后面括号中的 3 个条件表达式必须用“;”隔开。for 循环中的这 3 部分以及大括号中使循环体必需的 4 个组成部分完美地结合在一起,简单明了。

for 循环语句执行的过程为:首先执行条件表达式 1 进行初始化,然后判断条件表达式 2 的值是否为 true,如果为 true,则执行循环体语句块;否则直接退出循环。最后执行表达式 3,改变循环变量的值,至此完成一次循环。接下来进行下一次循环,直到条件表达式 2 的值为 false,才结束循环,其运行流程如图 1 所示。

img

图 1 for循环执行流程图

值得指出的是,for 循环的循环迭代语句并没有与循环体放在一起,因此即使在执行循环体时遇到 continue 语句结束本次循环,循环迭代语句也一样会得到执行。

for 循环和 while、do while 循环不一样:由于 while、do while 循环的循环迭代语句紧跟着循环体,因此如果循环体不能完全执行,如使用 continue 语句来结束本次循环,则循环迭代语句不会被执行。但 for 循环的循环迭代语句并没有与循环体放在一起,因此不管是否使用 continue 语句来结束本次循环,循环迭代语句一样会获得执行。

与前面循环类似的是,如果循环体只有一行语句,那么循环体的大括号可以省略。

例如,同样是计算 5 的阶乘,使用 for 循环的实现代码如下:

public static void main(String[] args) {
int result = 1;
for (int number = 1; number <= 5; number++) {
result *= number;
}
System.out.print(“5 的阶乘结果是:” + result); // 输出"5的阶乘结果是:120"
}

上述语句的含义可以理解为,将 number 变量的值从 1 开始,每次递增 1,直到大于 5 时终止循环。在循环过程中,将 number 的值与当前 result 的值进行相乘。

for 语句中初始化、循环条件以及迭代部分都可以为空语句(但分号不能省略),三者均为空的时候,相当于一个无限循环。下面对这些情况依次进行介绍。

1.条件表达式 1 为空

for 语句中条件表达式 1 的作用可以在程序的其他位置给出,所以当条件表达式 1 为空时,for 语句后面括号内其他条件表达式执行的顺序不变。

例如,使用 for 语句的这种形式计算 1~100 所有奇数的和。

public static void main(String[] args) {
int result = 0;
int number = 1; // 相当于for语句的第1个表达式
for (; number < 101; number++) {
if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
result += number;
}
System.out.print(“100 以内所有奇数和为:” + result);
}

执行后的输出结果如下:

100 以内所有奇数和为:2500

2.条件表达式 2 为空

当 for 语句中条件表达式 2 为空时,将没有循环的终止条件。此时 for 语句会认为条件表达式 2 的值总是为真,循环无限制执行下去。因此,为了使循环达到某种条件时退出,需要在语句块中进行逻辑判断,并使用 break 语句来跳出循环,否则将产生死循环。

同样是计算 1~100 所有奇数的和,使用这种方式的代码如下。

public static void main(String[] args) {
int result = 0;
for (int number = 1;; number++) {
if (number > 100)
break; // 相当于for语句的表达式2,满足时就退出for循环
if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
result += number;
}
System.out.print(“100 以内所有奇数和为:” + result);
}

3.条件表达式 3 为空

当 for 语言中条件表达式 3 为空时,也就没有设置控制变量的表达式,即每次循环之后无法改变变量的值,此时也无法保证循环正常结束。

同样是计算1~100 所有奇数的和,使用这种方式的代码如下:

public static void main(String[] args) {
int result = 0;
for (int number = 1; number < 101;) {
if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
result += number;
number++; // 相当于for语句的条件表达式3,每次递增1
}
System.out.print(“100 以内所有奇数和为:” + result);
}

如果没有循环体语句,number 变量的值为 1,永远小于 101,因此将无法结束循环,形成无限循环。在上面代码中将 number 的递增语句放在 for 循环体内,效果与完整 for 语句功能相同。

4.3 个条件表达式都为空

在 for 循环语句中,无论缺少哪部分条件表达式,都可以在程序的其他位置补充,从而保持 for 循环语句的完整性,使循环正常进行。

当 for 语句中循环体全为空时,即没有循环初值,不判断循环条件,循环变量不增值,此时无条件执行循环体,形成无限循环或者死循环。对于这种情况,读者在使用时应该尽量避免。

例如,计算 1~100 所有奇数的和,使用这种方式的代码如下:

public static void main(String[] args) {
int result = 0;
int number = 1; // 相当于for语句的条件表达式1
for (; {
if (number > 100)
break; // 相当于for语句的条件表达式2
if (number % 2 != 0) // 如果不能整除2,说明是奇数,则进行累加
result += number;
number++; // 相当于for语句的条件表达式3
}
System.out.print("100 以内所有奇数和为: " + result);
}

例 1

编写一个 Java 程序,统计某超市上半年的总销售量,要求由用户输入每月的销量。使用 for 循环的实现代码如下。

public static void main(String[] args) {
int sum = 0;
int num = 0;
Scanner sc = new Scanner(System.in);
for (int i = 1; i <= 6; i++) {
System.out.println(“请输入第” + i + " 个月的销售数量:");
num = sc.nextInt();
sum += num;
}
System.out.println(“上半年的销售总量为:” + sum);
}

在该程序中, 声明循环变量 i,控制循环的次数,它被初始化为 1。每执行一次循环,都要对 i 进行判断,看其值是否小于等于 6,条件成立则继续累加成绩,否则退出循环。

每执行完一次循环体,都会对 i 累加 1。如此循环重复,直到 i 的值大于 6 时停止循环。此时退出 for 循环体,执行最下方的语句输出累加的销售总量。

运行程序,执行结果如下所示。

请输入第1 个月的销售数量:
6840
请输入第2 个月的销售数量:
5449
请输入第3 个月的销售数量:
6546
请输入第4 个月的销售数量:
2400
请输入第5 个月的销售数量:
908
请输入第6 个月的销售数量:
8048
上半年的销售总量为:30191

一般选择循环变量时,习惯选择 i、j、k 来作为循环变量。

for、do-while 和 while 的区别

在《Java while和do while循环》中我们学习了 do-while 和 while 循环,这一节我们又学习了 for 循环。关于 do-while 和 while 具体的相同点和不同点在刚刚提到的教程中已经介绍过了,在这里不过多讲解了。下面主要介绍它们的区别,如下表 2 所示。

名称 概念 适用场景 特点
for 根据循环次数限制做多少次重复操作 适合循环次数是已知的操作 初始化的条件可以使用局部变量和外部变量使用局部变量时,控制执行在 for 结束后会自动释放,提高内存使用效率。且变量在 for 循环结束后,不能被访问。先判断,再执行
while 当满足什么条件的时候,才做某种操作 适合循环次数是未知的操作 初始化的条件只能使用外部变量,且变量在 while 循环结束后可以访问先判断,再执行
do-while 先执行一次,在判断是否满足条件 适合至少执行一次的循环操作 在先需要执行一次的情况下,代码更加简洁。先执行一次,再判断
例 2

分别用 for、do-while 和 while 求出 1-10 的和。

1)使用for循环

代码如下:

public static void main(String[] args) {
int sum = 0;
for (int i = 1; i < 11; i++) {
sum = sum + i;
}
System.out.println(sum);
}

运行结果为 55。

2)使用 do-while 循环

代码如下:

public static void main(String[] args) {
int sum = 0;
int i = 1;
do {
sum = sum + i;
i++;
} while (i < 11);
System.out.println(sum);
}

运行结果为 55。

3)使用 while 循环

代码如下:

public static void main(String[] args) {
int sum = 0;
int i = 1;
while (i < 11) {
sum = sum + i;
i++;
}
System.out.println(sum);
}

运行结果为 55。

从上边代码可以看出 for 语句明显更加简练,因为知道循环次数。

Java foreach语句的用法

foreach 循环语句是 Java 1.5 的新特征之一,在遍历数组、集合方面,foreach 为开发者提供了极大的方便。foreach 循环语句是 for 语句的特殊简化版本,主要用于执行遍历功能的循环。

foreach 循环语句的语法格式如下:

for(类型 变量名:集合) {
语句块;
}

其中,“类型”为集合元素的类型,“变量名”表示集合中的每一个元素,“集合”是被遍历的集合对象或数组。每执行一次循环语句,循环变量就读取集合中的一个元素,其执行流程如图 1 所示。

img
图 1 foreach 循环语句的执行流程图

例 1

假设有一个数组,采用 for 语句遍历数组的方式如下:

// 声明并初始化数组
int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };
System.out.println(“----for----”);
// for语句
for (int i = 0; i < numbers.length; i++) {
System.out.println(“Count is:” + numbers[i]);
}

上述第 2 行语句声明并初始化了 7 个元素数组集合,目前大家只需要知道当初始化数组时,要把相同类型的元素放到 {…} 中并且用逗号分隔(,)即可。

关于数组集合会在教程后面详细介绍,这里我们只需要大概了解就可以。numbers.length 是获得数组的长度,length 是数组的属性,numbers[i] 是通过数组下标访问数组元素。

那么采用 for-each 循环语句遍历数组的方式如下:

// 声明并初始化int数组
int[] numbers = { 43, 32, 53, 54, 75, 7, 10 };
System.out.println(“----for each----”);
// for-each语句
for (int item : numbers) {
System.out.println(“Count is:” + item);
}

从示例中可以发现,item 不是循环变量,它保存了集合中的元素,for-each 语句将集合中的元素一一取出来,并保存到 item 中,这个过程中不需要使用循环变量,通过数组下标访问数组中的元素。可见 for-each 语句在遍历集合的时候要简单方便得多。

例 2

String[] urls = { “http://c.biancheng.net/java”, “http://c.biancheng.net/c”, “http://c.biancheng.net/golang/” };
// 使用foreach循环来遍历数组元素
// 其中book将会自动迭代每个数组元素
for (String url : urls) {
System.out.println(url);
}

从上面程序可以看出,使用 foreach 循环遍历数组元素时无须获得数组长度,也无须根据索引来访问数组元素。

foreach 循环和普通循环不同的是,它无须循环条件,无须循环迭代语句,这些部分都由系统来完成,foreach 循环自动迭代数组的每个元素,当每个元素都被迭代一次后,foreach 循环自动结束。

当使用 foreach 循环来迭代输出数组元素或集合元素时,通常不要对循环变量进行赋值,虽然这种赋值在语法上是允许的,但没有太大的实际意义,而且极容易引起错误。例如下面程序。

String[] urls = { “http://c.biancheng.net/java”, “http://c.biancheng.net/c”, “http://c.biancheng.net/golang/” };
// 使用foreach循环来遍历数组元素,其中 book 将会自动迭代每个数组元素
for (String url : urls) {
url = “https://c.biancheng.net”;
System.out.println(url);
}
System.out.println(urls[0]);

运行上边程序,将看到如下结果:

https://c.biancheng.net
https://c.biancheng.net
https://c.biancheng.net
https://c.biancheng.net/java

从上面运行结果来看,由于在 foreach 循环中对数组元素进行赋值,结果导致不能正确遍历数组元素,不能正确地取出每个数组元素的值。而且当再次访问第一个数组元素时,发现数组元素的值依然没有改变。

不难看出,当使用 foreach 来迭代访问数组元素时,foreach 中的循环变量相当于一个临时变量,系统会把数组元素依次赋给这个临时变量,而这个临时变量并不是数组元素,它只是保存了数组元素的值。因此,如果希望改变数组元素的值,则不能使用这种 foreach 循环。

使用 foreach 循环迭代数组元素时,并不能改变数组元素的值,因此不要对 foreach 的循环变量进行赋值。

例 3

在一个字符串数组中存储了几种编程语言,现在将这些编程语言遍历输出。

foreach 语句的实现代码如下:

public static void main(String[] args) {
String[] languages={“Java”,“ASP.NET”,“Python”,“C#”,“PHP”};
System.out.println(“现在流行的编程语言有:”);
// 使用 foreach 循环语句遍历数组
for(String lang:languages) {
System.out.println(lang);
}
}

在循环体执行的过程中,每循环一次,会将 languages 数组中的一个元素赋值给 lang 变量,直到遍历 languages 数组中所有元素,循环终止。

该程序运行后的结果如下所示。

现在流行的编程语言有:
Java
ASP.NET
Python
C#
PHP

Java return语句

return 关键字并不是专门用于结束循环的,return 语句用于终止函数的执行或退出类的方法,并把控制权返回该方法的调用者。如果这个方法带有返回类型,return 语句就必须返回这个类型的值;如果这个方法没有返回值,可以使用没有表达式的 return 语句。

return 语句的一般语法格式如下:

return 与方法相同类型的变量;

如果一个方法使用了 return 语句并且后面跟有该方法返回类型的值,那么调用此方法后,所得到的结果为该方法返回的值。

例 1

当用户输入两个 double 类型的数值后需要计算这两个数值之和,而这两个操作数是可以变动的,但是求和的功能是不变的,这时就需要定义一个方法,只要在需要求和时调用该方法即可,该方法将计算之后的结果返回。代码如下:

import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println(“请输入操作数1:”);
double num1 = input.nextDouble(); // 获取用户输入的操作数1
System.out.println(“请输入操作数2:”);
double num2 = input.nextDouble(); // 获取用户输入的操作数2
double d = sum(num1, num2);
System.out.println(num1 + “+” + num2 + “=” + d);
}
/**
* 创建sum() 方法,返回double 类型的数值
*
* @param i 操作数1
* @param j 操作数2
* @return 两个操作数之和
*/
public static double sum(double i, double j) {
double sum = i + j;
return sum;
}
}

当用户输入两个 double 类型的数值后,程序调用 sum() 方法。该方法有两个参数,分别表示用户输入的操作数 1 和操作数 2。在调用该方法时,只需要将用户输入的两个数值传递过去即可,然后程序会执行 sum() 方法,对这两个数求和,并使用 return 语句将计算得出的结果返回。

在 main() 方法中,同样需要使用 double 类型的变量来接收 sum() 方法返回的值,即变量 d 为计算后的结果。

运行后的结果如下所示:

请输入操作数1:
500
请输入操作数2:
203
500.0+203.0=703.0
请输入操作数1:
5.66
请输入操作数2:
3.0158
5.66+3.0158=8.6758

Java break语句:跳出循环

某些时候需要在某种条件出现时强行终止循环,而不是等到循环条件为 false 时才退出循环。此时,可以使用 break 来完成这个功能。

break 用于完全结束一个循环,跳出循环体。不管是哪种循环,一旦在循环体中遇到 break,系统将完全结束该循环,开始执行循环之后的代码。

Java 中,break 语句有 3 种作用,分别是:在 switch 语句中终止一个语句序列、使用 break 语句直接强行退出循环和使用 break 语句实现 goto 的功能。

使用 break 语句直接强行退出循环(break 不带标签)

可以使用 break 语句强行退出循环,忽略循环体中的任何其他语句和循环的条件判断。在循环中遇到 break 语句时,循环被终止,在循环后面的语句重新开始。

例 1

小明参加了一个 1000 米的长跑比赛,在 100 米的跑道上,他循环地跑着,每跑一圈,剩余路程就会减少 100 米,要跑的圈数就是循环的次数。但是,在每跑完一圈时,教练会问他是否要坚持下去,如果回答 y,则继续跑,否则表示放弃。

使用 break 语句直接强行退出循环的示例如下:

public static void main(String[] args) {
Scanner input = new Scanner(System.in); // 定义变量存储小明的回答
String answer = “”; // 一圈100米,1000米为10圈,即为循环的次数
for (int i = 0; i < 10; i++) {
System.out.println(“跑的是第” + (i + 1) + “圈”);
System.out.println(“还能坚持吗?”); // 获取小明的回答
answer = input.next(); // 判断小明的回答是否为y?如果不是,则放弃,跳出循环
if (!answer.equals(“y”)) {
System.out.println(“放弃”);
break;
}
// 循环之后的代码
System.out.println(“加油!继续!”);
}
}

该程序运行后的效果如下所示:

跑的是第1圈
还能坚持吗?
y
加油!继续!
跑的是第2圈
还能坚持吗?
y
加油!继续!
跑的是第3圈
还能坚持吗?
n
放弃

尽管 for 循环被设计为从 0 执行到 10,但是当小明的回答不是 y 时,break 语句终止了程序的循环,继续执行循环体外的代码,输出“加油!继续!”。

break 语句能用于任何 Java 循环中,包括人们有意设置的无限循环。在一系列嵌套循环中使用 break 语句时,它将仅仅终止最里面的循环。例如:

public static void main(String[] args) {
// 外循环,循环5次
for (int i = 0; i < 5; i++) {
System.out.print(“第” + (i + 1) + “次循环:”);
// 内循环,设计为循环10次
for (int j = 0; j < 10; j++) {
// 判断j是否等于3,如果是,则终止循环
if (j == 3) {
break;
}
System.out.print(“内循环的第” + (j + 1) + “次循环\t”);
}
System.out.println();
}
}

该程序运行结果如下所示:

第1次循环:内循环的第1次循环 内循环的第2次循环 内循环的第3次循环
第2次循环:内循环的第1次循环 内循环的第2次循环 内循环的第3次循环
第3次循环:内循环的第1次循环 内循环的第2次循环 内循环的第3次循环
第4次循环:内循环的第1次循环 内循环的第2次循环 内循环的第3次循环
第5次循环:内循环的第1次循环 内循环的第2次循环 内循环的第3次循环

从程序运行结果来看,在内部循环中的 break 语句仅仅终止了所在的内部循环,外部循环没有受到任何的影响。

注意:一个循环中可以有一个以上的 break 语句,但是过多的 break 语句会破坏代码结构。switch 循环语句中的 break 仅影响 switch 语句,不会影响循环。

例 2

编写一个 Java 程序,允许用户输入 6 门课程成绩,如果录入的成绩为负则跳出循环;如果录入 6 门合法成绩,则计算已有成绩之和。

使用 break 语句的实现代码如下:

public static void main(String[] args) {
int score; // 每门课的成绩
int sum = 0; // 成绩之和
boolean con = true; // 记录录入的成绩是否合法
Scanner input = new Scanner(System.in);
System.out.println(“请输入学生的姓名:”);
String name = input.next(); // 获取用户输入的姓名
for (int i = 1; i <= 6; i++) {
System.out.println(“请输入第” + i + “门课程的成绩:”);
score = input.nextInt();// 获取用户输入的成绩
if (score < 0) { // 判断用户输入的成绩是否为负数,如果为负数,终止循环
con = false;
break;
}
sum = sum + score; // 累加求和
}
if (con) {
System.out.println(name + “的总成绩为:” + sum);
} else {
System.out.println(“抱歉,分数录入错误,请重新录入!”);
}
}

运行程序,当用户录入的分数低于 0 时,则输出“抱歉,分数录入错误,请重新录入!”信息,否则打印学生的总成绩。输出结果如下所示。

请输入学生的姓名:
zhangpu
请输入第1门课程的成绩:
100
请输入第2门课程的成绩:
75
请输入第3门课程的成绩:
-8
抱歉,分数录入错误,请重新录入!
请输入学生的姓名:
zhangpu
请输入第1门课程的成绩:
100
请输入第2门课程的成绩:
68
请输入第3门课程的成绩:
73
请输入第4门课程的成绩:
47
请输入第5门课程的成绩:
99
请输入第6门课程的成绩:
84
zhangpu的总成绩为:471

在该程序中,当录入第 3 门课的成绩时,录入的成绩为负数,判断条件“score<0”为 true,执行“con=false”,用 con 来标记录入是否有误。接着执行 break 语句,执行完之后程序并没有继续执行条件语句后面的语句,而是直接退出 for 循环。之后执行下面的条件判断语句,判断 boolean 变量的 con 是否为 true,如果为 true,则打印总成绩;否则打印“抱歉,分数录入错误,请重新录入!”。

使用 break 语句实现 goto 的功能(break 带标签)

有时候,在嵌套很深的循环语句中会发生一些不可预料的事情。此时可能更加希望跳到嵌套的所有循环语句之外。通过添加一些额外的条件判断实现各层循环的检测很不方便。

幸运的是,Java 与 C++ 不同,Java 提供了一种带标签的 break 语句,用于跳出多重嵌套的循环语句。

break 语句可以实现 goto 的功能,并且 Java 定义了 break 语句的一种扩展形式来处理退出嵌套很深的循环这个问题。

通过使用扩展的 break 语句,可以终止执行一个或者几个任意代码块,这些代码块不必是一个循环或一个 switch 语句的一部分。同时这种扩展的 break 语句带有标签,可以明确指定从何处重新开始执行。

break 除了具有 goto 退出深层循环嵌套作用外,还保留了一些程序结构化的特性。

标签 break 语句的通用格式如下:

break label;

label 是标识代码块的标签。当执行这种形式的 break 语句时,控制权被传递出指定的代码块。被加标签的代码块必须包围 break 语句,但是它不需要直接包围 break 的块。也就是说,可以使用一个加标签的 break 语句来退出一系列的嵌套块,但是不能使用 break 语句将控制权传递到不包含 break 语句的代码块。

用标签(label)可以指定一个代码块,标签可以是任何合法有效的 Java 标识符,后跟一个冒号。加上标签的代码块可以作为 break 语句的对象,使程序在加标签的块的结尾继续执行。

下面是使用带标签的break 语句的示例。

public class GotoDemo {
public static void main(String[] args) {
label: for (int i = 0; i < 10; i++) {

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

拿到字节跳动offer后,简历被阿里捞了起来,二面迎来了P9"盘问"

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

语句可以实现 goto 的功能,并且 Java 定义了 break 语句的一种扩展形式来处理退出嵌套很深的循环这个问题。

通过使用扩展的 break 语句,可以终止执行一个或者几个任意代码块,这些代码块不必是一个循环或一个 switch 语句的一部分。同时这种扩展的 break 语句带有标签,可以明确指定从何处重新开始执行。

break 除了具有 goto 退出深层循环嵌套作用外,还保留了一些程序结构化的特性。

标签 break 语句的通用格式如下:

break label;

label 是标识代码块的标签。当执行这种形式的 break 语句时,控制权被传递出指定的代码块。被加标签的代码块必须包围 break 语句,但是它不需要直接包围 break 的块。也就是说,可以使用一个加标签的 break 语句来退出一系列的嵌套块,但是不能使用 break 语句将控制权传递到不包含 break 语句的代码块。

用标签(label)可以指定一个代码块,标签可以是任何合法有效的 Java 标识符,后跟一个冒号。加上标签的代码块可以作为 break 语句的对象,使程序在加标签的块的结尾继续执行。

下面是使用带标签的break 语句的示例。

public class GotoDemo {
public static void main(String[] args) {
label: for (int i = 0; i < 10; i++) {

感受:

其实我投简历的时候,都不太敢投递阿里。因为在阿里一面前已经过了字节的三次面试,投阿里的简历一直没被捞,所以以为简历就挂了。

特别感谢一面的面试官捞了我,给了我机会,同时也认可我的努力和态度。对比我的面经和其他大佬的面经,自己真的是运气好。别人8成实力,我可能8成运气。所以对我而言,我要继续加倍努力,弥补自己技术上的不足,以及与科班大佬们基础上的差距。希望自己能继续保持学习的热情,继续努力走下去。

也祝愿各位同学,都能找到自己心动的offer。

分享我在这次面试前所做的准备(刷题复习资料以及一些大佬们的学习笔记和学习路线),都已经整理成了电子文档

[外链图片转存中…(img-2N1TeHKb-1713627607403)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-F9WxUoeH-1713627607403)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/2401_84433769/article/details/138015503

智能推荐

前端日志监控平台sentry使用 @sentry/browser @sentry/webpack-plugin-程序员宅基地

文章浏览阅读5.1k次。1.新旧SDK对比sentry前不久更新了js-jdk,以前使用的raven-js与webpack-sentry-plugin更新成了@sentry/browser @sentry/webpack-plugin旧 新raven-js @sentry/browser 前端错误日志上报SDKw..._@sentry/browser

Machine Learning and Data Mining(机器学习与数据挖掘)-程序员宅基地

文章浏览阅读2k次。Problems[show]ClassificationClusteringRegressionAnomaly detectionAssociation rulesReinforcement learningStructured predictionFeature engineeringFeature learningOnline lea..._data mining and machine learning

微信云托管:基本使用指南-程序员宅基地

文章浏览阅读1.3k次,点赞27次,收藏16次。确实是个好平台,部署个项目很简易,免去了很多运维上的事情。明白项目,采用哪个端口号。微信云托管-流水线配置、Dockerfile、服务配置都会有端口号,要明确配置的端口号是哪个。http 80 和 https 443 ,这两个协议默认的端口,大家都知道,但是也很容易忽略!Dockerfile文件和要部署的项目目录,同级目录才可。(可以通过 目标目录 来锁定目录位置。)在微信云托管中,通过配置环境变量,你可以向容器传递需要的配置信息。这在 Docker 中使用 -e 或 --env 选项_微信云托管

图像形态学变换_数学形态学结构元素类型-程序员宅基地

文章浏览阅读1.2w次,点赞2次,收藏10次。1_数学形态学结构元素类型

十一届中国大学生计算机设计大赛,我校在2018年(第十一届)中国大学生计算机设计大赛中再获佳绩...-程序员宅基地

文章浏览阅读214次。7月至8月,第十一届中国大学生计算机设计大赛在南京、上海和杭州等八个分赛区举行。我校现代教育技术中心负责人带领17名学生携6件作品参加了此次大赛。经过紧张、激烈的技能测试和现场答辩,我校荣获1个二等奖、5个三等奖的好成绩。本届全国大学生计算机设计大赛的参赛作品共分软件应用与开发、微课与教学辅助和数字媒体设计等九个大类,同时又细分为移动应用开发、物联网与智能设备、微电影、数字短片、纪录片等多个小类。..._2018全国计算机大学生设计大赛杭州

vue-cli打包后文件路径错误解决方案_ci打包 @路径问题-程序员宅基地

文章浏览阅读1.7k次。使用vue-cli构建的项目打包后字体图标路径错误预计路径是 xxx/static/fonts/icomoon.xxxxx.woff实际情况却是这样的xxx/static/css/static/fonts/icomoon.xxxxx.woff刚开始碰上这种情况很懵逼 不知道怎么解决 每次打包后都要去手动改路径后来研究了一下 发现是因为改了config目录里面的index.jsbuild..._ci打包 @路径问题

随便推点

仿抖音上下滑动分页视频,2024年阿里Android岗面试必问-程序员宅基地

文章浏览阅读830次,点赞21次,收藏19次。自定义LayoutManager,并且继承LinearLayoutManager,这样就得到一个可以水平排向或者竖向排向的布局策略。如果你接触过SnapHelper应该了解一下LinearSnapHelper和PagerSnapHelper这两个子类类,LinearSnapHelper可以实现让列表的Item居中显示的效果,PagerSnapHelper就可以做到一次滚动一个item显示的效果。

tensorflow+python flask进行手写识别_TensorFlow与Flask结合识别手写体数字-程序员宅基地

文章浏览阅读207次。阅读本文约“2.2分钟”TensorFlow框架——TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统——可被用于语音识别或图像识别等多项机器学习和深度学习领域——TensorFlow是将复杂的数据结构传输至人工智能神经网中进行分析和处理过程的系统——TensorFlow支持CNN、RNN和LSTM算法,这都是目前在Image,Speech和NLP最流行的深度神经网..._flask基于tensorflow1.14项目

Flink Table Api 将数据写出到mysql_flink 读取s3-程序员宅基地

文章浏览阅读9.5k次。Flink Table Api 将数据写出到mysql_flink 读取s3

QClipboard类文档_qt使用qclipboard的clear方法无法清除数据-程序员宅基地

文章浏览阅读407次。QClipboard类提供了对窗口系统剪贴板的访问。#include "qclipboard.h"继承了QObject。所有成员函数的列表。公有成员void clear()bool supportsSelection () constbool ownsSelection() constbool ownsClipboard() con..._qt使用qclipboard的clear方法无法清除数据

mybatis_plus获取批量插入id_mybatisplus批量插入获取id-程序员宅基地

文章浏览阅读1.4k次。mybatis_plus获取批量插入id_mybatisplus批量插入获取id

将date命令结果转换为yyyymmdd日期格式_date转yyyy-mm-dd-程序员宅基地

文章浏览阅读3.3k次。date -d yesterday '+%Y%m%d' 以yyyymmdd格式显示昨天日期date -d today '+%Y%m%d' 以yyyymmdd格式显示当天日期date -d tomarrow '+%Y%m%d' 以yyyymmdd格式显示明天日期_date转yyyy-mm-dd

推荐文章

热门文章

相关标签