1. 用户交互

java.util.Scanner 是 Java 5 的新特征,通过 Scanner 类来获取用户的输入。

通过 Scanner 类的 next()nextLine() 方法获取输入的字符串

  • 在读取前一般需要使用 hasNext()hasNextLine() 判断是否还有输入的数据

next()nextLine() 区别

  • next()

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

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

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
    3
    if (布尔表达式) {
    //如果布尔表达式为true将执行的语句
    }
  • if 双选择结构

    1
    2
    3
    4
    5
    if (布尔表达式) {
    //如果布尔表达式的值为true
    } else {
    //如果布尔表达式的值为false
    }
  • if 多选择结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (布尔表达式1) {
    // 如果布尔表达式1的值为true执行代码
    } else if (布尔表达式2) {
    // 如果布尔表达式2的值为true执行代码
    } else if (布尔表达式3) {
    // 如果布尔表达式3的值为true执行代码
    } else {
    // 如果以上布尔表达式都不为true执行代码
    }
  • 嵌套的 if 结构

    1
    2
    3
    4
    5
    6
    if (布尔表达式1) {
    // 如果布尔表达式1的值为true执行代码
    if (布尔表达式2) {
    // 如果布尔表达式2的值为true执行代码
    }
    }
3.2 switch 选择结构

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

语法格式:

1
2
3
4
5
6
7
8
9
10
11
switch (expression) {
case value:
// 语句
break; // 可选
case value:
// 语句
break; // 可选
//你可以有任意数量的case语句
default: // 可选
// 语句
}

switch 语句中的变量类型可以是:

  • byte、short、int 或者 char
  • 从 JavaSE 7 开始,switch 支持字符串 String 类型
  • case 标签必须为字符串常量或字面量

4. 循环结构

4.1 while 循环

语法格式:

1
2
3
while (布尔表达式) {
// 循环内容
}
4.2 do…while 循环

语法格式:

1
2
3
do {
// 代码语句
} while (布尔表达式);

while 和 do…while 的区别:

  • while 先判断后执行;do…while 是先执行后判断!
  • do…while 总是保证循环体会被至少执行一次!
4.3 for 循环

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

语法格式:

1
2
3
for (初始化; 布尔表达式; 更新) {
// 代码语句
}
4.4 增强 for 循环

Java5 引入了增强型 for 循环,用来循环遍历数组和集合。

语法格式:

1
2
3
for (声明语句: 表达式) {
// 代码句子
}
  • 声明语句:声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等。
  • 表达式:表达式是要访问的数组名,或者是返回值为数组的方法。
4.5 break continue
  • break
    • 在任何循环语句的主体部分,均可用 break 控制循环的流程
    • break 用于强行退出循环,不执行循环中剩余的语句
    • break 语句也在 switch 语句中使用
  • continue
    • continue 语句用在循环语句体中,用于跳过循环体中尚未执行的语句,接着进行下一次是否执行循环的判定