5、Java 流程控制
1. 用户交互
java.util.Scanner
是 Java 5 的新特征,通过 Scanner 类来获取用户的输入。
通过 Scanner 类的 next()
与 nextLine()
方法获取输入的字符串
- 在读取前一般需要使用
hasNext()
与hasNextLine()
判断是否还有输入的数据
next()
与 nextLine()
区别
-
next()
- 一定要读取到有效字符后才可以结束输入
- 对输入有效字符之前遇到的空白,
next()
方法会自动将其去掉 - 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符
- next() 不能得到带有空格的字符串
-
nextLine()
- 以 Enter 为结束符,
nextLine()
方法返回的是输入回车之前的所有字符 - 可以获得空白
- 以 Enter 为结束符,
Scanner 类也支持输入 int 或 float 类型的数据,但在输入之前最好先使用 hasNextXxx()
方法进行验证,再使用 nextXxx()
来读取。
通常,为了节省内存,选择调用 close() 方法关闭 Scanner 对象。
-
原因:
如果一个方法中创建了 Scanner 对象,却没有关闭,那么在方法结束后,Scanner 对象虽然会进入被回收的队列中,但不是立刻回收,而这会给计算机带来一定的负担。为了避免造成大量的内存占据,至少在方法结束前应该调用 Scanner 的 close() 方法。
-
注意:
如果在代码中关闭了 Scanner,那么在接下来的代码中将无法再使用 Scanner,即便再次声明了一个新的 Scanner 对象也是如此。Scanner 的 close() 方法会关闭 System.in,也就是Scanner对象在被初始化时所传入的参数。System.in 是一个 final 常量,在整个方法中只会被实例化一次。这也就导致了在第二次创建 Scanner 对象的时候并没有一个全新的 System.in 被传入,而是一个已经被关闭了的 System.in。
如果要关闭 Scanner 的话一定要确保在同一方法下接下来不会再调用 Scanner 来接受输入。
2. 顺序结构
顺序结构是最简单的算法结构,它是任何一个算法都离不开的一种基本算法结构。
3. 选择结构
3.1 if 选择结构
推荐使用
str1.equals(str2)
方法判断两个字符串是否相等,原因详见此文:JAVA中判断两个字符串是否相等
语法格式:
-
if 单选择结构
1
2
3if (布尔表达式) {
//如果布尔表达式为true将执行的语句
} -
if 双选择结构
1
2
3
4
5if (布尔表达式) {
//如果布尔表达式的值为true
} else {
//如果布尔表达式的值为false
} -
if 多选择结构
1
2
3
4
5
6
7
8
9if (布尔表达式1) {
// 如果布尔表达式1的值为true执行代码
} else if (布尔表达式2) {
// 如果布尔表达式2的值为true执行代码
} else if (布尔表达式3) {
// 如果布尔表达式3的值为true执行代码
} else {
// 如果以上布尔表达式都不为true执行代码
} -
嵌套的 if 结构
1
2
3
4
5
6if (布尔表达式1) {
// 如果布尔表达式1的值为true执行代码
if (布尔表达式2) {
// 如果布尔表达式2的值为true执行代码
}
}
3.2 switch 选择结构
switch case 语句判断一个变量与一系列值中某个值是否相等,每个值称为一个分支。
语法格式:
1 | switch (expression) { |
switch 语句中的变量类型可以是:
- byte、short、int 或者 char
- 从 JavaSE 7 开始,switch 支持字符串 String 类型
- case 标签必须为字符串常量或字面量
4. 循环结构
4.1 while 循环
语法格式:
1 | while (布尔表达式) { |
4.2 do…while 循环
语法格式:
1 | do { |
while 和 do…while 的区别:
- while 先判断后执行;do…while 是先执行后判断!
- do…while 总是保证循环体会被至少执行一次!
4.3 for 循环
for 循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
语法格式:
1 | for (初始化; 布尔表达式; 更新) { |
4.4 增强 for 循环
Java5 引入了增强型 for 循环,用来循环遍历数组和集合。
语法格式:
1 | for (声明语句: 表达式) { |
- 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
- 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
4.5 break continue
- break
- 在任何循环语句的主体部分,均可用 break 控制循环的流程
- break 用于强行退出循环,不执行循环中剩余的语句
- break 语句也在 switch 语句中使用
- continue
- continue 语句用在循环语句体中,用于跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定