1、Java 常用类——Scanner(扫描器) 类

java.util.Scanner 是 Java5 的新特征,我们可以通过 Scanner 类来获取用户的输入。

1.1、创建 Scanner 对象

Scanner的构造器支持多种方式,我们可以直接从输入流、文件和字符串中来构建Scanner对象。

借助于Scanner,我们既可以对任何字符串和基本类型(如int和double)的数据进行分析,也可以针对任何要处理的文本内容编写自定义的语法分析器。

1.1.1、创建输入流扫描器

1
Scanner s = new Scanner(System.in);
  • 创建Scanner对象时,需要传入System.in对象,Scanner通过传入的System.in获取用户输入。
  • 当我们创建完一个Scanner对象后,程序在执行next()或nextXxx()等方法时将会造成堵塞,直到有内容输入为止。
  • Scanner默认使用空格作为分割符来分隔文本,用户也可以使用方法**useDelimiter()**方法自定义新的分隔符。
  • 当用户输入一段字符串并按下回车键时,Scanner对象便可通过**next()或nextXxx()**方法逐个获取输入的字符串。
  • 在获取输入之前,往往需要使用**hasNext()或hasNextXxx()**方法判断是否还有输入数据。
  • hasNextXxx() 方法应与nextXxx() 方法配套使用。
  • Scanner 对象使用完毕后记得关闭。

1.1.2、创建文件扫描器

1
Scanner sc = new Scanner(new File("myNumbers"));

1.1.3、创建字符串扫描器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package com.atangbiji;

import java.util.Scanner;

public class ScannerDemo {
public static void main(String[] args) {
String input = "1 fish 2 fish red fish blue fish";
//创建文件扫描器,并自定义新的分隔符
Scanner s = new Scanner(input).useDelimiter("\\s*fish\\s*");
System.out.println(s.nextInt());
System.out.println(s.nextInt());
System.out.println(s.next());
System.out.println(s.next());
//关闭扫描器
s.close();
}
}

输出:

1
2
3
4
1
2
red
blue

1.2、使用nextLine()和next()方法获取输入的区别

(1)使用nextLine()方法获取输入

  • 以Enter为结束符,也就是说 nextLine()方法返回的是输入回车之前的所有字符。
  • 可以获得空白。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.atangbiji;

import java.util.Scanner;

public class ScannerDemo {
public static void main(String[] args) {
//创建一个扫描器对象,并传入System.in,用来接收键盘输入
Scanner scanner = new Scanner(System.in);

System.out.println("使用nextLine方法获取输入:");

//判断用户是否还有输入数据
if(scanner.hasNextLine()){
//使用nextLine方法获取输入
String str = scanner.nextLine();
System.out.println("输出内容为:" + str);
}

//反射属于IO流的类,如果不关闭会一直占用资源,所以要养成用完关闭的好习惯
scanner.close();
}
}

输出:

使用nextLine()方法获取输入

(2)使用next()方法获取输入

  • 一定要读取到有效字符后才可以结束输入。
  • 对输入有效字符之前遇到的空白,next() 方法会自动将其去掉。
  • 只有输入有效字符后才将其后面输入的空白作为分隔符或者结束符。
  • next() 不能得到带有空格的字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
package com.atangbiji;

import java.util.Scanner;

public class ScannerDemo {
public static void main(String[] args) {
//创建一个扫描器对象,并传入System.in,用来接收键盘输入
Scanner scanner = new Scanner(System.in);

System.out.println("使用next方法获取输入:");

//判断用户是否还有输入数据
if(scanner.hasNext()){
//使用next方法获取输入
String str = scanner.next();
System.out.println("输出内容为:" + str);
}

//反射属于IO流的类,如果不关闭会一直占用资源,所以要养成用完关闭的好习惯
scanner.close();
}
}

输出:(只输出了Hello)

使用next()方法获取输入

1.3、使用nextXxx()方法获取输入

如果要输入 int、float 等类型的数据,在 Scanner 类中也有支持,但是在输入之前最好先使用相应的 hasNextXxx() 方法进行验证,再使用 nextXxx() 方法来读取。

1.4、Scanner常用的其它方法

  • nextBigDecimal()

  • nextByte()

  • nextShort()

  • nextInt()

  • nextLong()

  • nextFloat()

  • nextDouble()

  • nextBoolean()

2、顺序结构

Java的基本结构就是顺序结构。

除非特殊说明,否则程序就会按顺序一句一句地往下执行。

3、选择结构

  1. if单项选择结构

    1
    2
    3
    if(条件){
    代码块 //可以是一条语句,也可以是一组语句
    }
  2. if双项选择结构

    1
    2
    3
    4
    5
    if(条件){
    //代码块1
    }else{
    //代码块2
    }
  3. if多项选择结构

    1
    2
    3
    4
    5
    6
    7
    if(条件1){
      //代码块1
    }else if(条件2){
      //代码块2
    }else{
      //代码块3
    }
  4. 嵌套的if结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    if(条件1){
      if(条件2){
        //代码块1
      }else{
        //代码块2
      }
    }else{
      //代码块3
    }
  5. switch多项选择结构

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    switch(表达式){
    case 常量1
    //代码块1;
    break;
    case 常量2:
    //代码块2;
    break;
    ... ...
    default:
    //代码块n;
    break;
    }
  • switch 语句中的变量类型可以是: byte、short、int、 char或 String 。

注:switch 和if语句的区别

  • switch和if-else相比,由于使用了Binary Tree算法,绝大部分情况下switch会快一点,除非是if-else的第一个条件就为true。
  • 编译器编译switch与编译if…else…不同。不管有多少case,都直接跳转,不需逐个比较查询。
  • 相比于if-else结构,switch的效率绝对是要高很多的,但是switch使用查找表的方式决定了case的条件必须是一个连续的常量。而if-else则可以灵活的多。
  • switch的效率与分支数无关。当只有分支比较少的时候,if效率比switch高(因为switch有跳转表)。分支比较多,那当然是使用switch的效率高。

4、循环结构

4.1、while循环

1
2
3
while(布尔表达式){
循环体;
}

当条件满足时执行循环体,直到条件不满足时跳出循环。

4.2、do…while循环

1
2
3
do{
循环体;
}while(布尔表达式);

先执行一次循环体,再判断条件是否满足。当条件满足时执行循环体,直到条件不满足时跳出循环。

4.3、for循环(重点)

1
2
3
for(初识条件表达式;布尔表达式;更新表达式){
循环体;
}

4.4、增强型for循环

  • 增强for循环(也称for-each循环)是JDK1.5以后引入的一个高级for循环。
  • 它专门用来遍历数组和集合
  • 其内部原理是一个Iteration迭代器,在遍历的过程中,不能对集合中的元素进行增删操作。
  • 要被遍历的对象.for”可快速生成增强型for循环。
1
2
3
for(循环变量类型 循环变量名称:要被遍历的对象){
循环体;
}

如:

1
2
3
4
5
int[] num = {1,2,3,4,5};
//遍历数组元素
for (int i:num) {
System.out.println(i);
}

**注:**Java采用“for”(而不是意义更明确的“foreach”)来引导这种一般被叫做“for-each循环”的循环,并使用“:”(而不是意义更明确的“in”)来分割循环变量名称和要被遍历的对象。

这样做的主要原因,是为了避免以为引入新的关键字,造成兼容性方面的问题。Java语言中,不允许把关键字当做变量名来使用。(虽然使用“foreach”这名字的情况并不多,但是“in”却是一个经常用来表示输入流的名字,例如java.lang.System类里,就有一个名字叫做“in”的static属性,表示“标准输入流”。)

5、break与continue

(1)break

  • 在任何循环语句的主体部分,均可使用break 控制循环的流程。
  • break的作用是:结束整个循环过程,不再执行循环中剩下的语句。
  • break也可以在switch语句中使用。
  • 在多层循环中, 一个break语句只向外跳一层。

(2)continue

  • continue语句用于循环语句体中。

  • continue的作用是:结束本次循环,直接进行下一次循环。

  • continue语句并没有终止整个循环。

    (本讲完,系列博文持续更新中…… )

阿汤笔迹微信公众平台

关注**“阿汤笔迹”** 微信公众号,获取更多学习笔记。
原文地址:http://www.atangbiji.com/2020/11/13/processControl
博主最新文章在个人博客 http://www.atangbiji.com/ 发布。