005. Java流程控制
Java流程控制
Scanner对象
java.util.Scanner
是Java5的新特性, 可以通过Scanner类来获取用户的输入.基本语法:
Scanner s = new Scanner(System.in);
通过Scanner类的next()
与nextLine()
方法获取输入的字符串, 在读取前一般使用hasNext()
与hasNextLine()
判断是否还有输入的数据.
import java.util.Scanner;
public class Demo01 {
public static void main(String[] args) {
//创建一个扫描器对象, 用于接收键盘数据
Scanner scanner = new Scanner(System.in);
System.out.println("使用next方式接收:");
//判断用户有没有输入字符串
if(scanner.hasNext()){
String str = scanner.next();
System.out.println("输入的内容:" + str);
}
//凡是属于IO流的类如果不关闭会一直占用资源, 应养成良好的习惯及时关闭
scanner.close();
}
}
使用next方式接收:
hello world
输入的内容:hello
import java.util.Scanner;
public class Demo02 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("使用nextLine方式接收:");
if(scanner.hasNextLine()){
String str = scanner.nextLine();
System.out.println("输入的内容为:"+str);
}
scanner.close();
}
}
使用nextLine方式接收:
hello world
输入的内容为:hello world
next()与nextLine()的区别
next()
- 一定要读取到有效字符后才可以结束输入;
- 对输入有效字符之前遇到的空格字符, next()方法会自动将其去掉;
- 只有输入有效字符后才将其后面输入的空格字符作为分隔符或者结束符;
- next()方法不能得到带有空格的字符串.
nextLine()
- 以
Enter
为结束符, 即: nextLine()方法返回的是输入回车前的所有字符; - 可以获得空格字符.
next()和hasNext()方法可以加后缀类型判断输入类型
import java.util.Scanner;
public class Demo04 {
public static void main(String[] args) {
int i = 0;
float f = 0.0f;
Scanner scanner = new Scanner(System.in);
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();
}
}
流程控制
顺序结构(Sequence Structure)
Java的基本结构, 也是最简单的结构, 除非特别指明, 否则就按照顺序一句一句执行. 它是任何算法都离不开的一种基本算法结构.
if选择结构
注意:判断字符串是否相同用equals
方法, 少用==
.
-
if单选择结构
if(布尔表达式){ //如果布尔表达式为true时将执行的语句 }
-
if双选择结构
if(布尔表达式){ //如果布尔表达式为true时将执行的语句 }else{ //如果布尔表达式为false时将执行的语句 }
-
if多选择结构
if(布尔表达式1){ //如果布尔表达式1为true时将执行的语句 }else if(布尔表达式2){ //如果布尔表达式2为true时将执行的语句 }else if(布尔表达式3){ //如果布尔表达式3为true时将执行的语句 }else{ //如果上述布尔表达式均为false时执行的语句 }
-
嵌套的if结构
if(布尔表达式1){ if(布尔表达式2){ //如果布尔表达式2为true时将执行的语句 } }
switch选择结构
目的: 判断一个变量与一系列值中某个值是否相等, 每个值称为一个分支.
switch(expression){
case value1:
//当expression的值与value1的值匹配时执行的语句
break;
case value2:
//当expression的值与value2的值匹配时执行的语句
break;
//可以添加任意数量的case语句
default:
//当当expression的值与所有value的值都不匹配时执行的语句
}
语句中变量类型为:
byte
,short
,int
或char
- 从Java SE7开始, switch支持
String
类型 case
标签必须为字符串常量或字面量
public class SwitchDemo02 {
public static void main(String[] args) {
String name = "何满子";
switch(name){
case "蝶忆":
System.out.println("蝶忆");
break;
case "何满子":
System.out.println("何满子");
break;
default:
System.out.println("???");
break;
}
}
}
输出结果:
何满子
为什么switch支持String?
通过反编译查看, 将class文件拷贝到java文件下, 在Idea中打开.
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.javastudy.struct;
public class SwitchDemo02 {
public SwitchDemo02() {
}
public static void main(String[] args) {
String name = "何满子";
byte var3 = -1;
switch(name.hashCode()) {
case 1099536:
if (name.equals("蝶忆")) {
var3 = 0;
}
break;
case 20420260:
if (name.equals("何满子")) {
var3 = 1;
}
}
switch(var3) {
case 0:
System.out.println("蝶忆");
break;
case 1:
System.out.println("何满子");
break;
default:
System.out.println("???");
}
}
}
可以看出, String在编译时是用哈希码对比.
case穿透: 当某一个case语句没有 break
时, 会继续执行该语句后的语句, 直到遇见break
或者跳出switch结构.
public class SwitchDemo01 {
public static void main(String[] args) {
char grade = 'C';
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("及格");
default:
System.out.println("挂科");
}
}
}
输出结果:
再接再厉
及格
挂科
while选择结构
while(布尔表达式){
//循环内容
}
do-while选择结构
do{
//语句
}while(布尔表达式);
for循环
for(初始化;布尔表达式;更新式){
//代码语句
}
增强for循环
for(声明语句:表达式){
//代码语句
}
声明语句: 声明新的局部变量, 该变量的类型必须和数组元素的类型匹配. 其作用域限定在循环语句块, 其值与此时数组元素的值相等.
表达式: 要访问的数组名, 或者是返回值为数组的方法.
public class ForDemo01 {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40, 50};
for (int x:numbers){
System.out.println(x);
}
}
}
输出结果:
10
20
30
40
50
等效于:
for (int i = 0; i < numbers.length; i++) {
System.out.println(numbers[i]);
}
break, continue, goto
break: 跳出循环, 不执行剩余的所有循环
continue: 跳过某次循环的某些语句
goto: 等同于带标签的break, continue
public class LabelDemo01 {
public static void main(String[] args) {
//寻找101-150之间的所有质数
outer:for(int i = 101; i < 151; 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
高山仰止, 景行行止; 虽不能至, 心向往之.