Scanner类中next()和nextLine()的区别
public class Next_And_NextLine {
private static Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
System.out.println("代码1");
code1();
System.out.println("==========================================");
System.out.println("代码2");
code2();
}
public static void code1(){
String string = scanner.next();
System.out.println(string);
string = scanner.nextLine();
System.out.println(string);
}
public static void code2(){
String string = scanner.nextLine();
System.out.println(string);
string = scanner.next();
System.out.println(string);
}
}
下图是执行过程
上面的代码中的方法code1()和code2()除了next()和nextLine()的执行顺序不同外,其他都相同,但是code2()有两次输入,而code1()只有一次输入,为什么会出现这种情况,下面是这这个过程的工作原理
工作原理
Scanner是一个扫描器,它扫描数据是从内存中一块缓冲区中扫描并读入数据的,而我们在控制台输入的数据也是先放入缓冲区中等待扫描器的扫描读取,这个扫描器在扫描过程中判断停止的依据是“空白符”(回车 空格等)从键盘输入的数据开始先保存在内存中的缓冲区中,而next()和nextLine()都是从缓冲区中读取数据
next(): 在扫描缓冲区遇到空白符结束时,将空白符之前的数据返回,在缓冲区中留下制表符,空格、换行符等空白符
nextLine():nextLine() 在遇到换行符符结束时,将空白符和空白符之前的数据都返回
看过工作原理后,来仔细了解一下这个过程
执行code1() 时,当遇到next()函数时,程序等待用户的输入,在上图中只看到输入了abc,但是在缓冲区中会出现换行符,因此,缓冲区中的数据是abc和换行符,有因为next()的工作原理,将abc读取后,在缓冲区中留下了换行符,下次读取的起点定位到abc之后换行符之前,当紧接着使用nextLine()函数时,它会自动读取换行符,函数结束,不会等待用户的输入
先使用nextLine()时,该函数会将缓冲区中扫描过的字符包括空白符都返回,接下来使用next()函数时,就会等待用户的输入