【JavaSE基础笔记 · 坎】Java流程控制

由 MisakaStone 发布

1 用户交互 Scanner

在我们之前学的基本语法中并没有实现程序和人的交互,但是Java提供给我们一个可以获取用户输入的工具类,即Scanner类。java.util.Scanner是 Java5 的新特征。

基本语法:

Scanner keyboard = new Scanner(System.in);
keyboard.close();   // close the Scanner object to avoid occupying the resource

//通过 Scanner类 的 next() 和 nextLine() 方法获取输入的字符串,在读取前我们一般需要使用 hasNext() 和 hasNextLine() 来判断是否还有输入的数据。

next()

  • 一定要读取到有效字符后才可以结束输入。
  • 对输入字符前遇到的空白,next() 方法会自动将其去掉。
  • 只有输入有效字符后才可以将其后面输入的空白作为分隔符结束符
  • next() 不能得到带有空格的字符串。

next()

nextLine()

  • 以Enter作为结束符,也就是说 nextLine() 方法返回的是输入回车之前的所有字符。
  • 可以获得空白。

1.5 Scanner 拓展

你可以使用 [keyboard].hasNextInt 来检测输入是否为整数,浮点数 float 同理。

Scanner keyboard = new Scanner(System.in);

System.out.println("Please input an integer");

if (keyboard.hasNextInt()) {
    int i = keyboard.nextInt();
    System.out.println("i = " + i);
} else {
    System.out.println("Your input is not an integer!");
}

keyboard.close();

输入 wow

Please input an integer
wow
Your input is not an integer!

输入 1921

Please input an integer
1921
i = 1921

拓展

// used to calculate the sum and average of a set of data

import java.util.Scanner;

public class HelloWorld {

    public static void main(String[] args) {

        Scanner keyboard = new Scanner(System.in);

        double sum = 0;
        int num = 0;

        System.out.println("The program will begin to calculate the sum and the average when your input is not a number");

        while (keyboard.hasNextDouble()) {

            double data = keyboard.nextDouble();
            num ++;
            sum += data;

        }

        System.out.println("sum = " + sum + "\naverage = " + sum / num);

        keyboard.close();

    }

}

2 顺序结构

Java的基本结构就是顺序结构,除非特别指明,否则就按照顺序一句一句执行。

顺序结构是最简单的算法结构,也是任何一个算法都离不开的一种基本算法结构。


3 选择结构

主要包括:

  • if 单选择结构
  • if 双选择结构
  • if 多选择结构
  • 嵌套 if 结构
  • switch 多选择结构

if 单选择结构

我们很多时候需要去判断一个东西是否可行,然后我们才去执行,这样一个过程在程序中用if语句来表示。

Scanner keyboard = new Scanner(System.in);

if (keyboard.hasNextInt()) {
    System.out.println("Tht input is an integer!");
}

keyboard.close();

if 双选择结构

Scanner keyboard = new Scanner(System.in);

if (keyboard.hasNextInt()) {
    System.out.println("Tht input is an integer!");
} else {
    System.out.println("The input is not an integer!");
}

keyboard.close();

if 多选择结构

Scanner keyboard = new Scanner(System.in);

System.out.println("Please input your scores");
int score = keyboard.nextInt();

if (score == 100) {
    System.out.println("Full Scores!");
} 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 {
    System.out.println("That's a pity!");
}

keyboard.close();

嵌套 if 结构

使用嵌套的 if...else 语句是合法的。也就是说你可以在另一个 if 或者 else if 语句中使用 if 或者 else if 语句。

语法:

if (boolean expression 1) {
    // codes while boolean expression 1 is true
    if (boolean expression 2) {
        // codes while boolean expression 2 is true
    }
}

switch 选择结构

多选择结构还有一个实现方式i就是 switch-case 语句。

switch-case 语句判断一个变量与一系列值中某个值是否相等,每一个值称为一个分支。

  • switch 语句中的变量类型可以是:byte、short、int 或者 char
  • 从 Java SE 7 开始,switch 支持字符串 String 了,同时 case 标签必须为字符串常量或字面量

语法:

switch (expression) {
    case value :
        // sentence
        break; // selectable
    case value :
        // sentence
        break; // selectable
    // you can have any amount of case sentencesJava
    default : // selectable
        // sentence    
}

增强版 switch 语句

Scanner keyboard = new Scanner(System.in);

char choice = keyboard.nextLine().charAt(0);

switch (choice) {
    case 'a' :
        System.out.println("A");
        break;
    case 'b' :
        System.out.println("B");
        break;
    case 'c' :
        System.out.println("C");
        break;
    default:
        System.out.println("Nothing!");
}
Scanner keyboard = new Scanner(System.in);

char choice = keyboard.nextLine().charAt(0);

switch (choice) {
    case 'a' -> System.out.println("A");
    case 'b' -> System.out.println("B");
    case 'c' -> System.out.println("C");
    default -> System.out.println("Nothing!");
}

若无 break ,则会出现 case 穿透现象。

IDEA可以实现反编译,要学会看源码


4 循环结构

  • while 循环
  • do...while 循环
  • for 循环

在 Java5 中引入了一种主要用于数组的增强型 for 循环。

while 循环

while 循环是最基本的循环,它的结构为:

while (boolean expression) {
    // contents of the circulation
}

只要布尔表达式为 true ,循环就会一直执行下去。

大多数情况下,我们需要一个让表达式失效的方式来结束循环。
只有少部分情况下,我们才需要让循环一直执行,比如服务器的请求响应监听等。

循环条件一直为 true 就会造成无限循环,即 死循环
在正常的业务编程中我们应该尽量避免死循环的出现,它会 影响程序性能 或者 造成程序卡死崩溃

  • 计算 1 + 2 + 3 + … + 100 = ?
int i = 1;
int sum = 0;

while (i <= 100) {
    sum += i;
    i ++;
}

System.out.println("sum = " + sum); // sum = 5050

do...while 循环

对于 while 循环语句而言,如果不满足条件时,则无法进入循环。
而 do…while 循环则会保证循环体至少执行一次。

int i = 0;
int sum = 0;

do {
    sum += i;
    i ++;
} while (i <= 100);

System.out.println("sum = " + sum); // sum = 5050

for 循环

虽然所有的循环结构都可以用 while 或者 do…while 表示,但 Java 提供了另外一种语句 — for 循环,使一些循环辩得更为简单。

for 循环语句是支持迭代的一种通用结构,是最有效、最灵活的循环结构。

for 循环执行的次数是在执行前就确定的,语法格式如下:

for (initialization; boolean expression; update) {
    // code sentences
}
  • 计算0到100之间的 奇数偶数 的和
int oddSum = 0;
int evenSum = 0;

for (int i = 0; i <= 100; i++) {

    if (i % 2 == 1) {
        oddSum += i;
    }

    if (i %2 == 0) {
        evenSum += i;
    }

}

System.out.println("oddSum = " + oddSum);
System.out.println("evenSum = " + evenSum);
  • 用 while 或 for 循环输出 1 - 1000 之间能被5整除的数,并且每行输出三个
int entry = 0;

for (int i = 0; i <= 1000; i++) {

    if (i % 5 == 0) {
        System.out.print(i + " ");
        entry ++;
    }

    if (entry == 3) {
        System.out.println();
        entry = 0;
    }

}
  • 打印九九乘法表
for (int i = 1; i <= 9; i++) {
    for (int j = 1; j <= i; j++) {
        System.out.print(j + "*" + i + "=" + (i * j) + "\t");
    }
    System.out.println();
}

输出:

1*1=1    
1*2=2    2*2=4    
1*3=3    2*3=6    3*3=9    
1*4=4    2*4=8    3*4=12    4*4=16    
1*5=5    2*5=10    3*5=15    4*5=20    5*5=25    
1*6=6    2*6=12    3*6=18    4*6=24    5*6=30    6*6=36    
1*7=7    2*7=14    3*7=21    4*7=28    5*7=35    6*7=42    7*7=49    
1*8=8    2*8=16    3*8=24    4*8=32    5*8=40    6*8=48    7*8=56    8*8=64    
1*9=9    2*9=18    3*9=27    4*9=36    5*9=45    6*9=54    7*9=63    8*9=72    9*9=81    

转义字符

转义字符意义ASCII码值(十进制)
a响铃(BEL)007
b退格(BS) ,将当前位置移到前一列008
f换页(FF),将当前位置移到下页开头012
n换行(LF) ,将当前位置移到下一行开头010
r回车(CR) ,将当前位置移到本行开头013
t水平制表(HT) (跳到下一个TAB位置)009
v垂直制表(VT)011
\代表一个反斜线字符'''092
'代表一个单引号(撇号)字符039
"代表一个双引号字符034
?代表一个问号063
0空字符(NUL)000
ddd1到3位八进制数所代表的任意字符三位八进制
xhh十六进制所代表的任意字符十六进制

break continue goto

在任何循环语句的主体部分,均可用 break 控制循环流程。
break 用于强行退出循环,不执行循环中剩余的语句。(break 也可在 switch 语句中使用)

continue 语句用在循环语句体中,用于终止某次循环过程,即跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定。

goto 关键字很早就在程序设计语言中出现。
尽管 goto 仍是 Java 的一个保留字,但并未在语言中得到正式的使用,因此我们也可以说 Java 没有 goto 。
然而,在 break 和 continue 两个关键字的身上,我们仍能看到一些 goto 的影子——带标签的 break 和 continue 。
“标签”是指后面跟一个冒号的标识符,例如 label:
对于 Java 来说唯一用到标签的地方是在循环语句之前,而在循环之前设置标签的唯一理由是:我们希望在其中嵌套另一个循环,由于 break 和 continue 关键字通常只中断当前循环,但若随同标签使用,它们就会中断到存在标签的地方。

简单来讲,break 用于强行退出整个循环,continue 用于终止某次循环,goto 很烦就不理解了。

  • 打印 101 - 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

打印三角形

使用循环打印一个 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();
}

输出:

    *
   ***
  *****
 *******
*********

感谢 狂神说 提供的 Java 学习资源


暂无评论

发表评论