Java流程控制
1.用户交互 Scanner(扫描器)
java.util.Scanner 是java5 的新特性,我们可以通过 Scanner 类来获取用户输入。
基本语法
Scanner s = new Scanner(System.in);
通过 Scanner 类的 next() 与 nextLine() 方法获取输入的字符串,再读取前,我们一般需要使用 hasNext() 与 hasNextLine() 判断是否还有输入的数据。
(1)next() 与 nextLine()的区别
next()
import java.util.Scanner;
public class Test {
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);
}
scanner.close(); //IO流对象不会自动关闭,需要使用.close()进行手动关闭。
}
}
输入 hello word! 输出 hello。
nextLine()
import java.util.Scanner;
public class Test {
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(); //IO流对象不会自动关闭,需要使用.close()进行手动关闭。
}
}
输入 hello word! 输出 ***hello word!***。
next():
①一定要读取到有效字符串后才可以结束输入,直接输入回车,程序仍然等待用户输入;
②对输入有效字符前遇到的空白,next()方法会自动将其去掉,如输入" hello",程序只读取到hello,空格会自动去掉;
③只有输入有效字符后,才将后面输入的空白作为分隔符或者结束符,因此输入"hello word!"时,程序只读取到 "hello";
④ next() 不能得到带有空格的字符串;
nextLine():
①以Enter为结束符,也就是说 nextLine() 可以返回回车前的所有字符。
②可以通过直接输入回车获得空白字符串。
③在使用 nextLine() 时,如果之前语句中恰好使用了 next(),需在中间穿插一条 nextLine() 用来吃掉上面的回车。
例: String str1 = scanner.next();
String str3 = scanner.nextLine(); //用来吃掉上面的回车
String str2 = scanner.nextLine();
System.out.println(str1);
System.out.println(str2);
(2)进阶
输入整数、浮点数等类型
int i = scanner.nextInt();
scanner.hasNextInt(); //判断是否输入了整数
float j = scanner.nextFloat();
scanner.hasNextFloat(); //判断是否输入了小数
2.顺序结构
JAVA的基本结构就是顺序结构,每条语句从上到下依次执行,是任何一种算法都离不开的基本结构
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
System.out.println("1");
System.out.println("2");
System.out.println("3");
}
}
3.选择结构
(1)if单选择结构
语法
if(布尔表达式){
//如果布尔表达式为 true,则执行该结构内部语句
}
例子
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
//equals()方法用于进行字符串值比较,不可使用 == ,因为 == 是字符串指向内存地址的比较。
if(s.equals("hello")){
System.out.println("您输入的 'hello'");
}
scanner.close();
}
}
只有当输入的 s 为 hello 时,才会输出语句。
(2)if双选择语句
语法
if(布尔表达式){
//如果布尔表达式为 true,则执行该结构内部语句
}else{
//如果布尔表达式为 false,则执行该结构内部语句
}
例子
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
if(i >= 60){
System.out.println("及格");
}else{
System.out.println("不及格");
}
scanner.close();
}
}
当输入数据大于等于60时,输出及格,否则输出不及格。
(3)if多选择结构
语法
if(布尔表达式){
}esle if(布尔表达式){
}else if(布尔表达式){
}
....
else{
}
例子
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int i = scanner.nextInt();
/*
if 语句最多只有一个 else,并且 else 语句要在所有的 else if 语句之后
if 语句可以有若干个 else if 语句,他们必须在 else 语句之前
一旦其中的一条 else if 语句检测为 true,则其他的else if 以及 else 语句都将跳过不被执行
*/
if(i>=90 && i<=100){
System.out.println("优秀");
}else if(i>=80 && i<90){
System.out.println("良好");
}else if(i>=70 && i<80){
System.out.println("中等");
}else if(i>=60 && i<70){
System.out.println("及格");
}else if(i>=0 && i<60){
System.out.println("不及格");
}else{
System.out.println("数据错误");
}
scanner.close();
}
}
(4)if嵌套结构
语法
if(布尔表达式){
if(布尔表达式){
...
}
}
(5)Switch 选择结构
switch case 语句判断一个变量与一系列值中的某个值是否相等,每个值成为一个分支。
语法
//expression 的类型只可以是 byte,short,int 或者 char,不能是 boolean,long,float,double 类型,在 JDK7 后,也支持 String 类型
switch(expression){
//case 标签必须为字符串常量或者字面量
case value1:
//语句
break; //若不加 break ,则程序会执行之后的所有语句,而不在意 case 是否匹配,这种现象称为 case 穿透
case value2:
//语句
break;
case value3:
//语句
break;
default: //当所有标签都不匹配时,执行default
//语句
}
例子
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
//创建扫描器对象
Scanner scanner = new Scanner(System.in);
//Scanner 类型不能接收单独的字符类型,所以接收字符串类型,再用charAt(0)函数取第一个字符返回
char x = (char) scanner.next().charAt(0);
switch(x){
case 'A':
System.out.println("优秀");
break;
case 'B':
System.out.println("良好");
case 'C':
System.out.println("中等");
case 'D':
System.out.println("及格");
default:
System.out.println("不及格");
}
sacnner.close();
}
}
结果
①当输入 A 时,输出优秀;
②当输入 B 时,由于 case 穿透现象,输出良好、中等、及格、不及格;
③当输入 A、B、C、D 外其它字符时,输出不及格;
4.循环结构
(1)while 循环
语法
while(布尔表达式){ //只要布尔表达式为真,循环就会一直执行下去
//循环内容
//大多数情况会通过布尔表达式的值让循环停下来
//循环条件一直为true,会造成无限循环,也就是死循环,会影响程序性能。一般出服务器监听程序外,我们都不会使用无限循环
}
例子
//输出1-10
public class Test {
public static void main(String[] args) {
int i =1;
while(i < 11){ //每次循环前,先判断 i<= 10 是否成立,若成立则执行循环体内语句(当循环结束时,i==11)
System.out.println(i);
i++;
}
}
}
(2)do…while 循环
语法
do{
//代码语句
}while(布尔表达式); //先执行一遍代码语句,再判断布尔表达式是否为真,若为真,则继续执行代码语句
while 与 do…while 的区别
① while 先判断布尔表达式是否成立,再执行语句。do...while 先执行一遍代码语句,再判断布尔表达式,若为真,则继续循环。
② do...while 总是保证循环体内代码语句至少会被执行一次。
例子
public class Test {
public static void main(String[] args) {
int x = 0;
while(x<0){ //因为 x<0 为假,所以不进入该循环
System.out.println(x);
x++;
}
System.out.println("===========");
do{
System.out.println(x); //do..while 循环先执行一遍循环体内代码语句,再进行判断,所以无论 x<0 是否成立,都会执行输出
x++;
}while(x<0);
}
}
输出结果为
===========
0
(3) for 循环
for 循环是支持迭代的一种通用结构,是最有效、最灵活的循环结构。
语法
for(初始化;布尔表达式;更新){
//循环体语句
}
例子
//输出1-10
public class Test {
public static void main(String[] args) {
for(int i = 1 ; i < 11 ; i++){
System.out.println(i);
}
}
}
注意
for 循环的 初始化、布尔表达式、更新 都可以赋值为空,一般用三者全部为空代表 无限循环 。
(4)增强 for 循环
主要用于遍历数组
语法
for(声明语句 : 表达式){
//循环体语句
}
例子
public class Test {
public static void main(String[] args) {
int []numbers = {5,4,3,2,1};
for(int x : numbers){
System.out.println(x); //遍历输出数组内元素
}
}
}
5.break & continue
break 用于跳出循环,continue 用于终止本次循环直接进入下一次循环。
例子
①break
public class Test {
public static void main(String[] args) {
int i =0;
while(i<10){
if(i%6==0){ //当 i%6 == 0 时结束循环
break;
}
System.out.println(i);
i++;
}
}
}
输出结果
0
1
2
3
4
5
②continue
public class Test {
public static void main(String[] args) {
int i =0;
while(i<10){
if(i%6==0){ //当 i%6 == 0 时结束本轮循环,进入下一轮循环
continue;
}
System.out.println(i);
i++;
}
}
}
输出结果
0
1
2
3
4
5
7 //因为 i == 6 时执行了continue,所以continue之后循环体内所有语句均不执行,直接执行到 i==7
8
9
拓展:带标签的 continue (类似 C语言 的 goto)
语法
标签:
continue 标签;
例子
public class Test {
public static void main(String[] args) {
//输出10-20之间所有的质数(只能被1和它本身整除的数)
outr://通过 continue 跳转到标签处时,不会再次执行初始化语句 int i =10;
for(int i=10;i<20;i++){
for(int j=2;j<i/2;j++){ //若是质数,则其整除的数一定在1/2区间内
if(i%j==0){
continue outr;
}
}
System.out.println(i);
}
}
}
此方法会破化面向对象的封装性,所以不建议使用