date: 2020-07-09 21:11:18
tags: Java学习
今天在学习数据结构使用数组模拟栈,在看完视频后自己使用Java代码实现时遇到了一个关于Scanner类使用方法next()与nextLine(),运行结果不同的问题。查了一些资料和论坛,先来整理一下,以供后续学习和复习。
问题描述
在测试数组模拟栈时,写了一个While循环提示信息,如下。
//测试
//创建一个arraystack 对象
ArrayStack stack = new ArrayStack(4);
boolean loop = true;
String key = "";
Scanner sr = new Scanner(System.in);
while (loop) {
System.out.println("show:显示栈");
System.out.println("exit:退出栈");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("请输入你的选择:");
key = sr.nextLine();
switch (key) {
case "show":
stack.showStack();
break;
case "push":
System.out.println("请输入你要入栈的数据:");
int val = sr.nextInt();
stack.push(val);
break;
case "pop":
try {
int res = stack.pop();
System.out.println("出栈的数据是:" + res);
} catch (Exception e) {
System.out.println(e.getMessage());
}
break;
case "exit":
sr.close(); //关闭流
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~~~~");
通过输入key值,使用Switch分支语句实现代码功能。初次我使用的是nextline()来实现key值输入,然后再运行push功能添加数据入栈后,提示界面刷新两次。
后来我把nextLine改为了next,就解决了这个问题。
key = sr.next();
为了解决这个问题,我去了解了一下next和nextLine的区别。
next()与nextLine的区别
Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取。
next()
next()一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
nextLine()
nextLine()方法的结束符只是Enter键,即nextLine()方法返回的是Enter键之前的所有字符。
总结
通过了解学习了next与nextLine的区别,我找到了出现上面问题的原因,运行程序后push入栈数据使用
int val = sr.nextInt();
nextInt()只能读取到enter之前的数据,把enter留在了缓冲区,刚好被nextLine()读取到,也就实现了再次刷新界面的效果。